我有它发生时我想要一个 MySQL 数据库中存储的 SHA1 哈希结果简单问题︰

多长时间的VARCHAR字段应在其中存储的哈希值的结果?

2009-03-05 11:57:16
问题评论:

如果您只 googled sha1 单击 im 感到幸运,您应该在哪里可以找到它始终为 160 位的维基百科。

回答:

对于可变长度数据,而不是固定的长度的数据将VARCHARVARCHAR因为 sha-1 值始终长 160 位,只会浪费额外的字节的固定长度字段的长度.

并且还不存储返回的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.57 M。InnoDB引擎。

在 PostgreSQL,最终结果对正确使用的 bytea 字段中?

@Gumbo︰ 先生,我相信,做过 !:)

解决方案很好,但还有另一个点以使用 hexed sha1 char(40)-这更广泛使用,并在应用程序代码中会有较少的转换问题。

Phpmyadmin 用户注意事项。时将哈希值存储为二进制文件,phpmyadmin 将它显示为十六进制字符串,但是 pma 将不能使用它在提供"搜索选项卡"。UNHEX()手动添加到 sql 的情况下,才会起作用。

您可以将可变数目的字节存储在 bytea 的 @Gumbo。指 bytea 类型的存储需求。这是"单字节或 4 字节加上实际的二进制字符串"。什么"1 / 4"指的是可以将其数据的长度存储,因为您不能使用一个零字节与 varchar 结束字符串。暗示,但不中提到手册 》 中,您可以到 2^(8*4) 或 bytea 4 + 千兆字节存储。postgresql.org/docs/9.0/static/datatype-binary.htmlPostgres 在数据库中存储哈希可能会为一或 bytea 列最小。

SHA1 哈希长度为 40 个字符 !

用十六进制编码...

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

假设 8 位二进制字符。如果存储为十六进制 40 个字符。

因此,长度为 10 16 位字符和 40 个十六进制数字。

在任何情况下决定要存储的格式,并将基于该格式的固定的大小的域。通过这种方式,您将不会有任何浪费的空间。

您仍可以使用 VARCHAR 始终不存储哈希的用户 (如身份验证/忘记了帐户的登录 url) 的情况下。一旦用户已通过身份验证/更改其登录信息他们不应该能够使用哈希,并应该有任何理由。您可以创建一个单独的表来存储临时哈希-> 无法删除的用户群体,但我并不认为大多数人会这样做。

内容来源于Stack Overflow Storing SHA1 hash values in MySQL
请输入您的翻译

Storing SHA1 hash values in MySQL

确认取消