Answers:
我将使用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)
需要4456 万,而char(40)
需要6457万。
InnoDB
发动机。
UNHEX()
手动添加到sql 时才有效。
SHA1哈希长度为40个字符!
以下是哈希算法及其所需位大小的列表:
使用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)
);
因此,长度介于10个16位字符和40个十六进制数字之间。
无论如何,请确定您要存储的格式,并根据该格式将字段设置为固定大小。这样,您将不会浪费任何空间。
如果您不总是为用户存储哈希(即,对帐户进行身份验证/忘记登录网址),则可能仍要使用VARCHAR。一旦用户认证/更改了他们的登录信息,他们就将无法使用哈希并且也没有理由。您可以创建一个单独的表来存储临时哈希->可以删除的用户关联,但我认为大多数人都不会这样做。
如果在sha1列上需要索引,出于性能原因,建议使用CHAR(40)。在我的情况下,sha1列是电子邮件确认令牌,因此在登录页面上,查询仅使用令牌输入。在我看来,在这种情况下,带INDEX的CHAR(40)是最佳选择:)
如果要采用此方法,请记住保留$ raw_output = false。