且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

使用哈希算法将字符串映射到数组中

更新时间:2022-03-22 14:33:22

需求

将不同字符串映射到对应数组,数组不够时自动成倍扩容,比如有一个数组String[4],现在准备将不同的string映射到String[4]上,str5时会自动扩容并重新打散。

str1-->String[3]
str2-->String[0]
str3-->String[2]
str4-->String[1]

方案

  1. 先使用哈希运算,比如用murmurhash3_x86_32算法得到一个32位的值a。
  2. 再用一个掩码取得数组下标,这个掩码可用数组长度-1,比如原始数组长度为4,则掩码为3,3的二进制即为11,与上面的哈希值a做&运算即能得到一个4以内的数b。
  3. 通过掩码计算出来的值可能会重复,所以可以加个判断,比如对于字符串str2,当所计算的值b数组元素不为空且又不等于str2时,则说明这个坑已经被其他字符串占用了,可以往上一个试试。
while(String[b]!=null && !String[b].equals(str2)){
    b++;
}
if(String[b]==null)
    String[b]=str2;
  1. 使用一个变量count用于计算已经使用了多少个坑,当count等于数组一半时就进行扩容,比如扩容到8,这时使用的新掩码为7,二进制即111。

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================