回答
我会将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. SHA1哈希澄清
- 2. SHA1哈希问题
- 3. Sha1哈希多个sha1哈希 - >安全以识别文件?
- 4. GPU MD5/SHA1哈希
- 5. SQLite SHA1哈希:如何?
- 6. 如何正确选择SHA1哈希值?
- 7. sha1哈希不工作? C#
- 8. 从QString获取Sha1哈希
- 9. MD5和SHA1 C++哈希库
- 10. Android Sha1哈希用户名和密码没有正确哈希
- 11. 转换base64'd SHA1哈希为十六进制哈希
- 12. 存储哈希值
- 13. 在javascript中使用sha1哈希文本
- 14. 搜索哈希sha1在bash脚本
- 15. 在Oracle中制作一行sha1哈希
- 16. MySQL在SHA1空select返回哈希密码
- 17. 继续PHP中的SHA1哈希
- 18. 是否可以将40个字符的SHA1哈希转换为20个字符的SHA1哈希?
- 19. 哈希函数的随机性,如SHA1
- 20. 通过.net技术在Ruby中创建SHA1哈希值
- 21. 计算SHA1哈希算法Powershell V2.0
- 22. C SHA1哈希不起作用
- 23. 比较SHA1哈希登录wordpress帐户
- 24. Openssl实现改进的sha1哈希
- 25. rails sha1哈希路由到对象?
- 26. 为什么base64 sha1/sha256哈希?
- 27. 使用CryptoAPI的MD5-SHA1哈希
- 28. 单向SHA1哈希javascript实现?
- 29. SHA1哈希十六进制字符串
- 30. 什么类型的哈希?(MD5,SHA1)
如果你只是GOOGLE上搜索SHA1点击即时感觉幸运,你应该在维基百科上,你可以找到它始终是160位。 – 2009-03-05 12:19:49