当我想在SHA数据库中存储SHA1哈希的结果时,我遇到了一个简单的问题:
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 );
百万条记录binary(20)
需要44.56M,而char(40)
需要64.57M.
InnoDB
发动机.
SHA1哈希是40个字符长!
从这篇博客中摘录:
下面是散列算法列表及其需求位大小:
MD5 = 128位哈希值.
SHA1 = 160位哈希值.
SHA224 = 224位哈希值.
SHA256 = 256位哈希值.
SHA384 = 384位哈希值.
SHA512 = 512位哈希值.
创建一个带需要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位字符).