为什么数据结构中不使用加密哈希函数?

4
虽然一些算法(如MD5)在安全领域中的表现并不理想,但其他算法(如SHA系列函数)在这方面一直表现良好。尽管在它们的域中存在碰撞的发现或理论存在,但加密哈希函数仍然提供了一个对于任意长度和类型的数据具有极其分布均匀的固定长度输出映射。那么为什么它们不经常用于数据结构中呢?设想一下,如果一个好的哈希函数可以将每个输入映射到唯一的键值,使得链接、嵌套表和其他冲突处理技术变得毫无意义,那么哈希表的目标不就是这样吗?能够将几乎任何东西馈送给一个函数,并且知道你将收到的关键字的确切长度,这肯定非常方便!看起来这是一个退役安全协议的理想用途。

1
在哈希表中,你几乎总是会在将索引缩小为表的大小时遇到碰撞,因为你可能不想创建一个拥有2^128个条目的表 ;) - CodesInChaos
最近有一股潮流转向SipHash,这是一种带密钥的加密哈希,以避免攻击者通过碰撞来进行拒绝服务攻击。(搜索哈希DoS) - CodesInChaos
2
请注意,密码哈希函数的碰撞抗性完全取决于输出大小。使用32位哈希,即使是理想的哈希函数也必须预计在大约2^16个密钥(65,000个,这是哈希表的完美大小)处发生碰撞,这是由于生日问题引起的。 - user395760
1个回答

4
密码散列函数可以用作散列表中的哈希函数,但并不经常使用。密码散列的缺点在于与散列表中使用的传统哈希函数相比,所需的处理能力非常昂贵。
传统哈希函数具有建立哈希表所需的所有特征,但执行时需要更少的CPU周期。尽管如此,现在大多数芯片组都包括这些密码散列的硬件加速器。
使用密码散列函数生成的“索引”太大了。因此,您需要通过减少或屏蔽来将其修剪下来。(您不需要16字节的哈希表索引;)总的来说,它们通常不值得麻烦。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接