编程语言
首页 > 编程语言> > ELFHash 算法python改写和拓展

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