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

标签 hashtable programming-languages hash-function

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

最佳答案

那些..不是同一种“哈希函数” 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) 直接从对象状态派生,谨慎地应用“调整”,以及 2) 不是设计为“安全”。

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

另一方面,cryptographic hash旨在提供更强的加密要求并具有更大的输出空间。虽然这样的强哈希可以用于哈希表(在从对象派生然后提炼到哈希桶之后),但它们的生成速度也较慢并且通常在散列/字典

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

Hashtable hash 可取的特性:

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

加密哈希具有附加特性,超出了哈希表哈希的特性:

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

编程语言通过其 standard libraries 支持各种不同的加密哈希函数和/或第 3 方库。更广为人知的散列(例如 MD5/SHA-x)通常会得到普遍支持,而更专业的散列(例如 MD6)可能需要额外的努力来定位实现。

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

关于hashtable - 编程语言用于字典/关联数组的默认哈希函数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52030777/

相关文章:

programming-languages - 如何为应用程序创建计算机或脚本语言?

c++ - unordered_map 哈希函数 C++

c - 如何获取 xmlHashTable 的键? (libxml2)

java - 变量名与哈希函数有什么关系?

programming-languages - 上下文无关语法和其他语法有什么区别?

.net - 这种新的 Axum 编程语言是什么?

c++ - 无法创建自定义哈希函数 unordered_map?

任何枚举类型的 C++11 哈希函数

algorithm - 搜索不存在且从未存在的 key O(n)?

Java 集合排序加上手动排序