Java 标准库在实践中如何实现哈希表?

Java 标准库在实践中如何实现哈希表?,java,c++,python,hash,language-agnostic,Java,C++,Python,Hash,Language Agnostic,一些编程语言(如python、Java和C++11)的标准库中包含哈希表(尽管有时使用扩展功能的不同名称)。我想从高层次的算法角度理解已经实现了什么。具体而言: 键的哪个函数用于给出放置数据的位置(即使用的哈希函数是什么) 他们使用哪些算法来解决冲突?举个例子,他们中有人使用过吗 是否使用随机性来选取散列函数 对于Java 散列函数本身是如何计算的 它们由类本身通过int hashCode() 他们使用哪些算法来解决冲突?例如,它们中有没有使用简单的链接 典型的简单链接。Java8将支持用于字

一些编程语言(如python、Java和C++11)的标准库中包含哈希表(尽管有时使用扩展功能的不同名称)。我想从高层次的算法角度理解已经实现了什么。具体而言:

  • 键的哪个函数用于给出放置数据的位置(即使用的哈希函数是什么)
  • 他们使用哪些算法来解决冲突?举个例子,他们中有人使用过吗
  • 是否使用随机性来选取散列函数
      对于Java

      散列函数本身是如何计算的

      它们由类本身通过
      int hashCode()

      他们使用哪些算法来解决冲突?例如,它们中有没有使用简单的链接

      典型的简单链接。Java8将支持用于字符串冲突的树

      是否使用随机性来选取散列函数


      不,,除了字符串元素/键以避免DOS攻击。

      你不能只看一个开源实现吗?有一个特定于python的答案。@CarlNorum:我怀疑任何人都不可能通过简单地阅读一个哈希表的源代码实现来真正理解哈希表背后的理论。对任何感兴趣的人来说:这似乎是一个相关的博文@ArtemPelenitsyn这是一个很好的链接,但是没有提到随机化,我认为随机化是现代实现的一个重要部分。谢谢。为给出放置数据的位置而计算的数学函数是什么?我的意思是,如果键是x,那么一个选项可能是a*x+b mod p mod m,其中p是一个大素数,a和b在0和p-1之间,m是表的大小。@Raphael它不使用素数,因为
      %
      很昂贵。相反,它使用这个函数
      h^=(h>>>20)^(h>>>12);返回h^(h>>>7)^(h>>4)然后取最低位。i、 一个面具,谢谢。这很有趣。@Raphael你可能会觉得这很有趣