문제

SHA1 해시의 결과를 MySQL 데이터베이스에 저장하고 싶을 때 발생하는 간단한 질문이 있습니다.

얼마나 오래 바르 차 해시의 결과를 저장하는 필드는?

도움이 되었습니까?

해결책

나는 사용할 것이다 VARCHAR 가변 길이 데이터의 경우 고정 길이 데이터는 아닙니다. SHA-1 값이기 때문입니다 언제나 160 비트 길이 VARCHAR 그냥 낭비 할 것입니다 고정 길이 필드의 길이에 대한 추가 바이트.

그리고 나는 또한 가치를 저장하지 않을 것입니다 SHA1 돌아오고있다. 문자 당 4 비트 만 사용하므로 160/4 = 40자가 필요하기 때문입니다. 그러나 문자 당 8 비트를 사용하는 경우 160/8 = 20 문자 긴 필드 만 있으면됩니다.

그래서 사용하는 것이 좋습니다 BINARY(20) 그리고 UNHEX 기능 변환합니다 SHA1 이진에 대한 가치.

스토리지 요구 사항을 비교했습니다 BINARY(20) 그리고 CHAR(40).

CREATE TABLE `binary` (
    `id` int unsigned auto_increment primary key,
    `password` binary(20) not null
);
CREATE TABLE `char` (
    `id` int unsigned auto_increment primary key,
    `password` char(40) not null
);

백만의 기록과 함께 binary(20) 44.56m가 소요됩니다 char(40) 64.57m가 소요됩니다.InnoDB 엔진.

다른 팁

SHA1 해시는 40 숯이 길다!

이 블로그에서 가져온 참조 :

아래는 비트 크기와 함께 해싱 알고리즘 목록입니다.

  • MD5 = 128 비트 해시 값.
  • SHA1 = 160 비트 해시 값.
  • SHA224 = 224 비트 해시 값.
  • SHA256 = 256 비트 해시 값.
  • SHA384 = 384 비트 해시 값.
  • SHA512 = 512 비트 해시 값.

require char (n)와 함께 하나의 샘플 테이블을 만들었습니다.

CREATE TABLE tbl_PasswordDataType
(
    ID INTEGER
    ,MD5_128_bit CHAR(32)
    ,SHA_160_bit CHAR(40)
    ,SHA_224_bit CHAR(56)
    ,SHA_256_bit CHAR(64)
    ,SHA_384_bit CHAR(96)
    ,SHA_512_bit CHAR(128)
); 
INSERT INTO tbl_PasswordDataType
VALUES 
(
    1
    ,MD5('SamplePass_WithAddedSalt')
    ,SHA1('SamplePass_WithAddedSalt')
    ,SHA2('SamplePass_WithAddedSalt',224)
    ,SHA2('SamplePass_WithAddedSalt',256)
    ,SHA2('SamplePass_WithAddedSalt',384)
    ,SHA2('SamplePass_WithAddedSalt',512)
);

SHA1의 출력 크기는 160 비트입니다. 160/8 == 20 숯 (8 비트 숯을 사용하는 경우) 또는 160/16 = 10 (16 비트 숯을 사용하는 경우)입니다.

따라서 길이는 10 개의 16 비트 숯과 40 개의 16 진수 사이입니다.

어쨌든 저장하려는 형식을 결정하고 해당 형식에 따라 필드를 고정 크기로 만듭니다. 그렇게하면 낭비되는 공간이 없습니다.

사용자를 위해 항상 해시를 저장하지 않는 경우 Varchar를 여전히 사용할 수 있습니다 (즉, 계정을 인증/로그인 URL을 잊어 버렸습니다). 사용자가 로그인 정보를 인증/변경 한 후에는 해시를 사용할 수 없어야하며 이유가 없어야합니다. 삭제 될 수있는 임시 해시 -> 사용자 협회를 저장하기 위해 별도의 테이블을 만들 수 있지만 대부분의 사람들이 이것을 귀찮게하지 않는다고 생각합니다.

SHA1 열에 인덱스가 필요한 경우 성능상의 이유로 Char (40)를 제안합니다. 내 경우 SHA1 열은 이메일 확인 토큰이므로 방문 페이지에서 쿼리는 토큰으로만 들어갑니다. 이 경우 색인이있는 Char (40)는 제 생각에 최선의 선택입니다 :)

이 방법을 채택하려면 $ raw_output = false를 남겨 두십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top