回答
我会将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
function将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
发动机。
在PostgreSQL中,这将转化为使用bytea字段,对吧? – mvexel 2011-01-17 10:44:50
@Gumbo:先生,我相信你已经做到了! :) – 2011-09-23 19:49:04
解决方案非常棒,但还有一点要使用带有hexed sha1的char(40) - 这种方法使用得更广泛,并且应用程序代码中的转换问题会更少。 – 2013-09-09 08:29:46
SHA1哈希长度为40个字符!
在十六进制编码... – 2009-03-05 12:10:49
sha1的输出大小为160位。这是160/8 == 20个字符(如果您使用8位字符)或160/16 = 10(如果您使用16位字符)。
所以长度在10个16位字符和40个十六进制数字之间。
无论如何决定你要存储的格式,并根据该格式使该字段为固定大小。 这样你就不会有浪费的空间。
如果您不总是为用户存储散列(即认证帐户/忘记登录url),您可能仍然希望使用VARCHAR。一旦用户认证/更改了他们的登录信息,他们就不应该能够使用散列,并且应该没有理由。你可以创建一个单独的表来存储可以删除的临时哈希 - >用户关联,但我不认为大多数人都会这么做。
如果你需要sha1列的索引,我建议CHAR(40)出于性能原因。 在我的情况下,sha1列是一个电子邮件确认标记,因此在着陆页上查询只能使用标记进入。 在这种情况下,带INDEX的CHAR(40),在我看来,是最好的选择:)
如果你想采用这种方法,记得离开$ raw_output = false。
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)
);
- 1. MYSQL从SHA1生成登录哈希值
- 2. MySQL SHA1哈希不匹配
- 3. SHA1哈希澄清
- 4. SHA1哈希问题
- 5. Sha1哈希多个sha1哈希 - >安全以识别文件?
- 6. GPU MD5/SHA1哈希
- 7. SHA1哈希值差异不大
- 8. SQLite SHA1哈希:如何?
- 9. 如何正确选择SHA1哈希值?
- 10. sha1哈希不工作? C#
- 11. 从QString获取Sha1哈希
- 12. 如何找到SHA1哈希?
- 13. G-wan C Sha1哈希
- 14. MD5和SHA1 C++哈希库
- 15. ASCII SHA1哈希红宝石
- 16. Android Sha1哈希用户名和密码没有正确哈希
- 17. 转换base64'd SHA1哈希为十六进制哈希
- 18. 存储哈希值
- 19. 保存哈希值
- 20. 在Oracle中制作一行sha1哈希
- 21. 搜索哈希sha1在bash脚本
- 22. 在javascript中使用sha1哈希文本
- 23. MySQL在SHA1空select返回哈希密码
- 24. 继续PHP中的SHA1哈希
- 25. D中的SHA1索引哈希表
- 26. 是否可以将40个字符的SHA1哈希转换为20个字符的SHA1哈希?
- 27. 哈希函数的随机性,如SHA1
- 28. 在PostgreSQL中存储FreeRADIUS用户密码的SHA1哈希摘要
- 29. 通过.net技术在Ruby中创建SHA1哈希值
- 30. 计算SHA1哈希算法Powershell V2.0
如果你只是GOOGLE上搜索SHA1点击即时感觉幸运,你应该在维基百科上,你可以找到它始终是160位。 – 2009-03-05 12:19:49