2009-03-05 108 views
138

我有一个简单的问题时,我想一个SHA1哈希的结果存储在MySQL数据库中,其发生:存放在MySQL SHA1哈希值

VARCHAR场是多久我在其中存储哈希的结果?

+8

如果你只是GOOGLE上搜索SHA1点击即时感觉幸运,你应该在维基百科上,你可以找到它始终是160位。 – 2009-03-05 12:19:49

回答

283

我会将VARCHAR用于可变长度数据,但不适用于固定长度的数据。因为SHA-1值是总是 160位长,VARCHAR只会浪费an additional byte for the length of the fixed-length field

而且我也不会存储SHA1正在返回的值。因为它每个字符仅使用4位,因此需要160/4 = 40个字符。但是,如果您使用每个字符8位,则只需要160/8 = 20个字符长的字段。

因此,我建议您使用BINARY(20)UNHEX functionSHA1值转换为二进制。

我比较了存储要求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发动机。

+2

在PostgreSQL中,这将转化为使用bytea字段,对吧? – mvexel 2011-01-17 10:44:50

+9

@Gumbo:先生,我相信你已经做到了! :) – 2011-09-23 19:49:04

+0

解决方案非常棒,但还有一点要使用带有hexed sha1的char(40) - 这种方法使用得更广泛,并且应用程序代码中的转换问题会更少。 – 2013-09-09 08:29:46

36

SHA1哈希长度为40个字符!

+80

在十六进制编码... – 2009-03-05 12:10:49

6

sha1的输出大小为160位。这是160/8 == 20个字符(如果您使用8位字符)或160/16 = 10(如果您使用16位字符)。

3

所以长度在10个16位字符和40个十六进制数字之间。

无论如何决定你要存储的格式,并根据该格式使该字段为固定大小。 这样你就不会有浪费的空间。

2

如果您不总是为用户存储散列(即认证帐户/忘记登录url),您可能仍然希望使用VARCHAR。一旦用户认证/更改了他们的登录信息,他们就不应该能够使用散列,并且应该没有理由。你可以创建一个单独的表来存储可以删除的临时哈希 - >用户关联,但我不认为大多数人都会这么做。

2

如果你需要sha1列的索引,我建议CHAR(40)出于性能原因。 在我的情况下,sha1列是一个电子邮件确认标记,因此在着陆页上查询只能使用标记进入。 在这种情况下,带INDEX的CHAR(40),在我看来,是最好的选择:)

如果你想采用这种方法,记得离开$ raw_output = false。

8

Reference taken from this blog:

下面是与它的需要比特大小沿着散列算法的列表:

  • 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') 
    ,SHA1('SamplePass') 
    ,SHA2('SamplePass',224) 
    ,SHA2('SamplePass',256) 
    ,SHA2('SamplePass',384) 
    ,SHA2('SamplePass',512) 
);