编程语言对字典/关联数组使用的默认哈希函数是什么?

时间:2018-08-26 22:43:01

标签: hashtable programming-languages hash-function

所以当我知道字典或关联数组通常由哈希表实现时,我感到很好奇。在阅读了有关哈希表的信息后,我偶然发现了哈希函数,了解到有各种哈希函数,例如md5,md6,sha-1等。我找不到的是编程语言(例如python,C ++)使用的哈希函数,java?

1 个答案:

答案 0 :(得分:1)

那些..不是同一种“哈希函数” D:

对于hashtable hash functions代码必须根据对象数据计算适当的哈希值,以使其符合相等性要求。它也应该是“分布良好”和“快速”的。因此,大多数哈希表哈希通常使用某种形式的滚动/移位计算为32位值。在一天结束时,此哈希用于从更小的存储池中选择。

哈希表散列通常由添加到哈希表中的对象直接计算(或了解)。也就是说,通常,密码散列函数不涉及 哈希表。一个典型的Java hashCode()函数,在被添加到哈希表的对象上定义了 ,例如:

int hash = 7;
hash = 31 * hash + (int) int_field;
hash = 31 * hash + (str_field == null ? 0 : str_field.hashCode());
// etc.
return hash;

discussions on the choice of seed and multiplication values elsewhere ..但是,应该采取的行动是大多数哈希表哈希函数1)直接从对象状态派生,谨慎地应用“ tweaks”,以及2)不是 >设计为“安全”。

(现代哈希表实现通常将“混合函数”应用于生成的哈希值,以减轻退化的哈希函数结果和/或数据中毒攻击。)

另一方面,cryptographic hash旨在提供更高的密码要求并具有更大的输出空间。虽然可以将强大的哈希 用于哈希表(从对象派生然后精简到哈希桶之后),但生成它们的速度也较慢,并且通常在以下情况下是不必要的:哈希/字典。

密码散列通常可用于任意数据块或字节流。

Hashtable哈希的理想特征:

  • 确定性
  • 均匀分布/避免聚类
  • 速度,速度,速度

密码散列具有额外的特征,除了散列表哈希以外:

  • 无法从其哈希值生成消息
  • 无法找到具有相同哈希值的两条不同消息
  • (虽然加密散列也应该 很快,但是速度在很大程度上仅次于附加要求。)

编程语言通过其standard libraries和/或第三方库支持多种不同的加密哈希函数。更为知名的哈希(例如MD5 / SHA-x)通常具有通用支持,而更专业的哈希(例如MD6)则可能需要更多的精力来定位实现。

另一方面,如上所示,许多哈希表“函数”是按照标准模式直接在哈希表所涉及的对象上实现的,其中某些语言(和IDE)为减少手动编码提供了帮助。例如,C#为结构类型提供了默认的基于反射的GetHashCode实现。