最近项目上需要应用到字符串判断重复的功能,根据之前的经验可以通过hash的方式来进行。当然也有人会说,你既然是用python,为什么不能直接用字典数据类型的键名来处理呢。这里可能会用的非常大的数据量,所以需要通过hashmap的方式来达到O(1)的效率。
经过CSDN上翻阅大量的技术文章,发现很多推荐ELFHash算法的,列举了各项优点。但是发现基本上都是C版本,或者JAVA版本的代码。所以需要自己改写成python版本:
def ELFhash(strings): hash=0 x=0 str_len=len(strings) # print(str_len) for i in range(str_len): hash=(hash<<4)+ord(strings[i]) #hash左移4位,把当前字符ASCII存入hash低四位 #支持中文字符的URL x=hash&0xF000000000000000 #如果最高的四位不为0,则说明字符多余7个,现在正在存第7个字符, #如果不处理,再加下一个字符时,第一个字符会被移出,因此要有如下处理。 #该处理,如果最高位为0,就会仅仅影响5-8位,否则会影响5-31位,因为C语言使用的算数移位 #因为1-4位刚刚存储了新加入到字符,所以不能>>28 if x: hash^=(x>>56) #下面这行代码并不会对X有影响,本身X和hash的高4位相同, #下面这行代码&~即对28-31(高4位)位清零。 hash&=~x # return (hash&0x7FFFFFFF) return hash
在原C版本上,做了如下的参数修改:
1,0xF0000000 -> 0xF000000000000000;
2,hash^=(x>>24) -> x>>56;
这样输出的hash就从原来的32位拓宽到了64位,但是这样的修改,不确定对于原来的算法的均匀性会产生多大的影响。希望有大神能够帮忙做一些验证哈。。。
参考文章如下:
https://blog.csdn.net/liangzhaoyang1/article/details/51377996
https://blog.csdn.net/ltyqljhwcm/article/details/52966874