所以当我知道字典或关联数组通常由哈希表实现时,我感到很好奇。在阅读了有关哈希表的信息后,我偶然发现了哈希函数,了解到有各种哈希函数,例如md5,md6,sha-1等。我找不到的是编程语言(例如python,C ++)使用的哈希函数,java?
答案 0 :(得分:1)
那些..不是同一种“哈希函数” 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)直接从对象状态派生,谨慎地应用“ tweaks”,以及2)不是 >设计为“安全”。
(现代哈希表实现通常将“混合函数”应用于生成的哈希值,以减轻退化的哈希函数结果和/或数据中毒攻击。)
另一方面,cryptographic hash旨在提供更高的密码要求并具有更大的输出空间。虽然可以将强大的哈希 用于哈希表(从对象派生然后精简到哈希桶之后),但生成它们的速度也较慢,并且通常在以下情况下是不必要的:哈希/字典。
密码散列通常可用于任意数据块或字节流。
Hashtable哈希的理想特征:
密码散列具有额外的特征,除了散列表哈希以外:
编程语言通过其standard libraries和/或第三方库支持多种不同的加密哈希函数。更为知名的哈希(例如MD5 / SHA-x)通常具有通用支持,而更专业的哈希(例如MD6)则可能需要更多的精力来定位实现。
另一方面,如上所示,许多哈希表“函数”是按照标准模式直接在哈希表所涉及的对象上实现的,其中某些语言(和IDE)为减少手动编码提供了帮助。例如,C#为结构类型提供了默认的基于反射的GetHashCode实现。