hashtable - 编程语言对字典/关联数组使用的默认哈希函数是什么?
问题描述
所以当我知道字典或关联数组通常由哈希表实现时,我很好奇。在阅读哈希表时,我偶然发现了哈希函数,我了解到有各种哈希函数,如 md5、md6、sha-1 等。我无法找到 Python、C++ 等编程语言使用的哈希函数,爪哇?
解决方案
这些是.. 不是同一种“散列函数”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 实现。
推荐阅读
- python - 让 ComplementNB 在 Colab 中运行
- typescript - “--strictFunctionTypes”和泛型联合类型的推断
- reactjs - 替换后历史推送
- hyperledger-fabric - 无法更改在线 Composer Playground 的版本
- java - 即使数组不是那么大,为什么我要为这个简单的任务得到超时错误?
- ruby-on-rails - Rails 5 在 Wicked PDF 中显示值
- javascript - 我可以从 passport-auth-token 获取标头参数吗
- r - 重新编码调查多项选择题的输出
- keycloak - 从 keycloak 3.2.1 升级到 4.5 时出错
- javascript - Mouseenter 事件正在跳过元素