ELFHash 算法python改写和拓展
作者:互联网
ELFHash 算法python改写和拓展
最近项目上需要应用到字符串判断重复的功能,根据之前的经验可以通过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
标签:ELFHash,python,len,改写,算法,str,hash 来源: https://blog.csdn.net/weixin_43276165/article/details/118488212