3

当引用 PHP 中的 sha1 或 md5 等哈希值的长度时,将其解释为内存中哈希的大小而不是文字中存在的字符数是否正确?

4

3 回答 3

3

是的,它确实。然而,这个大小与字符串中的字符数量密切相关——如果你得到一个原始字符串,你将得到每 8 位 1 个字符;如果您获得十六进制数字(默认值),则每 4 位获得 1 个字符。

于 2013-02-10T08:50:39.927 回答
0

这是明确存储散列所需的最小位数。

>>> len(hashlib.md5('foo').digest()) * 8
128
>>> len(hashlib.sha1('foo').digest()) * 8
160
>>> len(hashlib.sha512('foo').digest()) * 8
512
于 2013-02-10T08:51:22.003 回答
0

安全散列函数的主要输出始终以位定义。因此,当提到散列函数的输出时,密码学家总是谈论例如 128 位用于损坏的 MD5 算法,160 位用于 SHA1,显然 256 位用于 SHA-256。

然而,大多数加密 API 仅适用于字节。这意味着如果存在特定方法来指示哈希大小,则通常会返回以字节为单位的大小。因此,对于上述算法,这将是 16、20 和 32 个字节。

当然,字节以例如十六进制返回,那么字符串的字符长度将是其两倍。字符串长度应返回 32、40 或 64 个字符。如果转换为相同的字节数取决于字符编码(例如,使用 UTF-16 会使字节数加倍)。

散列函数确实具有很大的内部状态,因此运行实现所占用的字节数远高于输出中的位数。不过,它并没有你在现代 PC 上注意到的那么高。

于 2013-02-10T13:00:35.333 回答