ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

ELFHash 算法python改写和拓展

2021-07-05 14:03:28  阅读:336  来源: 互联网

标签:ELFHash python len 改写 算法 str hash


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有