我有一个简单的问题,当我想把SHA1哈希值存储到MySQL数据库中时,它出现了:
我应该为存储哈希结果的VARCHAR字段设置多长长度?
我有一个简单的问题,当我想把SHA1哈希值存储到MySQL数据库中时,它出现了:
我应该为存储哈希结果的VARCHAR字段设置多长长度?
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
);
使用InnoDB引擎,百万条记录中binary(20)
占用44.56M,而char(40)
占用64.57M。
UNHEX()
添加到SQL语句中才能正常工作。 - Timo HuovinenSHA1哈希值长度为40个字符!
以下是哈希算法及其所需位数的列表:
创建一个需要 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位。如果您使用8位字符,则为160/8 = 20个字符,如果您使用16位字符,则为160/16 = 10个字符。
因此,长度介于10个16位字符和40个十六进制数字之间。
无论如何,决定您要存储的格式,并根据该格式设置字段的固定大小。这样,您就不会浪费任何空间。
在某些情况下,您可能仍希望使用VARCHAR,例如在不始终为用户存储哈希值的情况下(即身份验证帐户/忘记登录URL)。 一旦用户已经验证/更改了他们的登录信息,他们就不应该能够使用哈希,并且也没有理由这样做。 您可以创建一个单独的表来存储临时哈希 -> 用户关联,但我认为大多数人不会费心去这样做。