dictionaries/associative 数组的编程语言使用的默认哈希函数是什么?

What are the default hash functions used by programming languages for dictionaries/associative arrays?

所以当我知道字典或关联数组通常由哈希表实现时,我很好奇。在阅读哈希表时,我偶然发现了哈希函数,我了解到有各种哈希函数,例如 md5、md6、sha-1 等。我无法找到的是 [=14 等编程语言使用的是哪种哈希函数=]、C++、java?

那些..不是同一种 'hash function' D:

对于 hashtable hash functions代码必须根据对象数据 计算适当的散列,使其符合相等性要求。它也应该是 "well distributed" 和 "fast"。因此,大多数 hashtable 哈希通常是使用某种形式的 rolling/shifting 计算的 32 位值。在一天结束时,这个哈希用于 select 来自 小得多的桶池

Hashtable 哈希通常由(或知道)要添加到哈希的对象直接计算table - 也就是说,通常, 加密散列函数 涉及散列 table。一个典型的 Java hashCode() 函数,定义 对象被添加到散列 table,例如可能看起来像:

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..但要点应该是大多数散列table散列函数1)直接从对象状态派生,谨慎应用'tweaks',以及2 ) 不是 设计为 "secure"。

(现代哈希table 实现通常对生成的哈希值应用 "mixing function" 以减轻退化哈希函数结果 and/or 数据中毒攻击。)

另一方面,cryptographic hash 旨在提供更强的加密要求并具有更大的输出 space。虽然如此强大的散列 可以 用于散列 table s(在从对象派生然后蒸馏到散列桶之后),但它们的生成速度也较慢并且在 hash/dictionary.

的上下文中通常是不必要的

加密哈希通常适用​​于任意数据块或字节流。

Hashtable hash 理想特性:

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

加密哈希具有 额外的 特征,超越了哈希 table 哈希:

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

编程语言通过其 standard libraries and/or 第三方库 支持范围广泛的不同加密哈希函数。更广为人知的散列(例如 MD5/SHA-x)通常会得到普遍支持,而更专业的散列(例如 MD6)可能需要额外的努力才能找到其实现。

另一方面,如上所示,许多散列 table 'functions' 是直接在散列 table 中涉及的对象上实现的,遵循标准模式,使用某些语言(和 IDE)提供帮助以减少手动编码。例如,C# 为结构类型提供了默认的基于反射的 GetHashCode 实现。