首页 > 解决方案 > 编程语言对字典/关联数组使用的默认哈希函数是什么?

问题描述

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

标签: hashtableprogramming-languageshash-function

解决方案


这些是.. 不是同一种“散列函数”D:

对于散列表散列函数代码必须根据对象数据计算适当的散列,使其符合相等要求。它还应该“分布良好”和“快速”。因此,大多数哈希表哈希通常是使用某种形式的滚动/移位计算的 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;

在其他地方有关于种子和乘法值的选择的讨论.. 但采取的方法应该是大多数哈希表哈希函数 1)直接从对象状态派生,谨慎地应用“调整”,以及 2)不是设计为“安全的”。

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

另一方面,密码散列旨在提供更强大的密码要求并具有更大的输出空间。虽然如此强的散列用于散列表(在从对象派生然后提取到散列桶之后),但它们的生成速度也较慢,并且在散列/字典的上下文中通常是不必要的

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

Hashtable 散列可取的特性:

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

除了哈希表哈希之外,加密哈希还有其他特征:

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

编程语言通过其标准库和/或第 3 方库支持各种不同的加密哈希函数。更知名的散列(例如 MD5/SHA-x)通常具有通用支持,而更专业的散列(例如 MD6)可能需要额外的努力才能找到实现。

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


推荐阅读