代码之家  ›  专栏  ›  技术社区  ›  niklasfi Rahul Tripathi

在MySQL中存储SHA1哈希值

  •  148
  • niklasfi Rahul Tripathi  · 技术社区  · 17 年前

    当我想在MySQL数据库中存储SHA1哈希的结果时,我遇到了一个简单的问题:

    这个项目需要多长时间 字段是否是存储哈希结果的字段?

    7 回复  |  直到 16 年前
        1
  •  316
  •   ESG    11 年前

    我会用 VARCHAR 适用于可变长度数据,但不适用于固定长度数据。因为SHA-1值是 160位长,这个 瓦尔查尔 an additional byte for the length of the fixed-length field .

    SHA1 他回来了。因为它每个字符仅使用4位,因此需要160/4=40个字符。但如果每个字符使用8位,则只需要160/8=20个字符长的字段。

    所以我建议你使用 BINARY(20) UNHEX function 转换 沙一

    二进制(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) char(40) 需要64.57米。 InnoDB 发动机

        2
  •  45
  •   schmilblick    17 年前

        3
  •  11
  •   Toby Allen mercator    8 年前

    Reference taken from this blog:

    • MD5=128位哈希值。
    • SHA1=160位哈希值。
    • SHA224=224位哈希值。
    • SHA384=384位哈希值。
    • SHA512=512位哈希值。

    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)
    );
    
        4
  •  6
  •   inazaruk    17 年前

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

        5
  •  3
  •   Douglas Leeder    17 年前

    因此,长度介于10个16位字符和40个十六进制数字之间。

    在任何情况下,请确定要存储的格式,并根据该格式将字段设置为固定大小。

        6
  •  2
  •   Keith Harty    15 年前

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

        7
  •  2
  •   Francesco Casula    14 年前

    如果您需要sha1列上的索引,出于性能原因,我建议使用CHAR(40)。 在我的例子中,sha1列是一个电子邮件确认令牌,因此在登录页上,查询只使用令牌输入。

    如果要采用此方法,请记住保留$raw_output=false。