답변:
내가 사용하는 것이 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
엔진.
UNHEX()
SQL에 수동으로 추가하는 경우에만 작동합니다 .
아래는 필요한 비트 크기와 함께 해싱 알고리즘의 목록입니다.
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 열에 색인이 필요한 경우 성능상의 이유로 CHAR (40)을 제안합니다. 필자의 경우 sha1 열은 전자 메일 확인 토큰이므로 방문 페이지에서 쿼리는 토큰으로 만 입력됩니다. 이 경우 INDEX가있는 CHAR (40)이 최선의 선택이라고 생각합니다. :)
이 방법을 사용하려면 $ raw_output = false를 그대로 두십시오.