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

Hashtable 编程语言在字典/关联数组中使用的默认哈希函数是什么?,hashtable,programming-languages,hash-function,Hashtable,Programming Languages,Hash Function,所以当我知道字典或关联数组通常由哈希表实现时,我很好奇。在阅读哈希表时,我偶然发现了哈希函数,我了解到了各种散列函数,如MD5、MD6、SHA-1等。我无法找到的是,哪些函数被Python、C++、java?< /P> < P>等编程语言所使用。不同类型的“哈希函数”D: 例如,代码必须基于对象数据计算适当的哈希,以使其符合等式要求。它还应该分布均匀、速度快。因此,大多数哈希表哈希通常是使用某种形式的滚动/移位计算的32位值。在一天结束时,该散列用于从更小的桶池中进行选择 哈希表哈希通常由要添加

所以当我知道字典或关联数组通常由哈希表实现时,我很好奇。在阅读哈希表时,我偶然发现了哈希函数,我了解到了各种散列函数,如MD5、MD6、SHA-1等。我无法找到的是,哪些函数被Python、C++、java?< /P> < P>等编程语言所使用。不同类型的“哈希函数”D:

例如,代码必须基于对象数据计算适当的哈希,以使其符合等式要求。它还应该分布均匀、速度快。因此,大多数哈希表哈希通常是使用某种形式的滚动/移位计算的32位值。在一天结束时,该散列用于从更小的桶池中进行选择

哈希表哈希通常由要添加到哈希表中的对象直接计算,也就是说,哈希表中通常不涉及加密哈希函数。例如,在添加到哈希表的对象上定义的典型Java函数可能如下所示:

int hash = 7;
hash = 31 * hash + (int) int_field;
hash = 31 * hash + (str_field == null ? 0 : str_field.hashCode());
// etc.
return hash;
有。。但采取的方法应该是,大多数哈希表哈希函数1直接从对象状态派生,谨慎地应用“调整”,而2不是为了安全而设计的

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

另一方面,a的设计目的是提供更强的加密要求,并具有更大的输出空间。虽然这样的强散列可以在从对象派生后用于哈希表,然后提取到散列桶,但它们生成速度较慢,并且在散列/字典上下文中通常是不必要的

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

哈希表哈希特性:

确定性 均匀分布/避免群集 速度,速度,速度 除了哈希表哈希之外,加密哈希还有其他特性:

无法从其哈希值生成消息 无法找到具有相同哈希值的两条不同消息 虽然加密散列也应该是快速的,但速度在很大程度上是次要的附加要求。 编程语言通过其和/或第三方库支持各种不同的加密哈希函数。一个更知名的hash(如MD5/SHA-x)通常具有通用支持,而一些更专业的hash(如MD6)可能需要额外的工作来定位的实现


另一方面,如上所示,许多哈希表“函数”是按照标准模式直接在哈希表中涉及的对象上实现的,一些语言和IDE提供了帮助以减少手动编码。例如,C为结构类型提供了一个默认的基于反射的GetHashCode实现。。不同的“散列函数”D:另一方面,a的设计目的是提供更强的加密要求和输出空间。它们是我知道的加密散列函数,但我想知道编程语言使用的是哪一种?它们是否有任何名称或身份,比如加密HF?编程语言不使用加密函数,程序使用。语言支持通常通过库实现的不同功能。。。规范不会强制要求使用特定的哈希函数。某些特定的实现可能有自己的实现。许多编程语言的实现都是自由软件,因此您可以深入研究它们的源代码并研究它的特性,这就清楚了很多。我还想弄明白,这些核心功能本质上是相同的,对吗?只有复杂性才有区别。我说的对吗?这两种哈希都有相似的基本属性——即它们必须是确定性的,应该是均匀分布的,并且应该是快速的fsvo;然而,加密哈希有一些附加的要求,在大多数基本的哈希表用法中可以跳过/忽略这些要求。当加密散列不再能够满足这些要求时,就会出现安全漏洞-即;更大的影响..是的,加密哈希的额外复杂性或更大的池也确保了冲突概率变得可以忽略,这与字典哈希没有太大关系。对于哈希表,有一组相对较小的bucket,因此,有效分布比“在最初巨大但折叠/截断的输出空间中减少碰撞”更相关。加密散列函数应按其他目标均匀分布,但这并不意味着适当的非加密散列分布不够均匀。。一些哈希表实现 ons还将执行散列混合以改善分布。