问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

哈希算法从原理到实战

发布网友 发布时间:2022-11-25 09:22

我来回答

1个回答

热心网友 时间:2023-10-09 05:57

引言 

       将任意长度的二进制字符串映射为定长二进制字符串的映射规则我们称为散列(hash)算法,又叫哈希(hash)算法,而通过原始数据映射之后得到的二进制值称为哈希值。哈希表(hash表)结构是哈希算法的一种应用,也叫散列表。用的是数组支持按照下标随机访问数据的特性扩展、演化而来。可以说没有数组就没有散列表。

哈希算法主要特点

        从哈希值不能反向推导原始数据,也叫单向哈希。

        对输入数据敏感,哪怕只改了一个Bit,最后得到的哈希值也大不相同。

        散列冲突的概率要小。

        哈希算法执行效率要高,散列结果要尽量均衡。

哈希算法的核心应用

         安全加密 :对于敏感数据比如密码字段进行MD5或SHA加密传输。

         唯一标识 :比如图片识别,可针对图像二进制流进行摘要后MD5,得到的哈希值作为图片唯一标识。

         散列函数 :是构造散列表的关键。它直接决定了散列冲突的概率和散列表的性质。不过相对哈希算法的其他方面应用,散列函数对散列冲突要求较低,出现冲突时可以通过开放寻址法或链表法解决冲突。对散列值是否能够反向解密要求也不高。反而更加关注的是散列的均匀性,即是否散列值均匀落入槽中以及散列函数执行的快慢也会影响散列表性能。所以散列函数一般比较简单,追求均匀和高效。

        *负载均衡 :常用的负载均衡算法有很多,比如轮询、随机、加权轮询。如何实现一个会话粘滞的负载均衡算法呢?可以通过哈希算法,对客户端IP地址或会话SessionID计算哈希值,将取得的哈希值与服务器列表大小进行取模运算,最终得到应该被路由到的服务器编号。这样就可以把同一IP的客户端请求发到同一个后端服务器上。

        *数据分片 :比如统计1T的日志文件中“搜索关键词”出现次数该如何解决?我们可以先对日志进行分片,然后采用多机处理,来提高处理速度。从搜索的日志中依次读取搜索关键词,并通过哈希函数计算哈希值,然后再跟n(机器数)取模,最终得到的值就是应该被分到的机器编号。这样相同哈希值的关键词就被分到同一台机器进行处理。每台机器分别计算关键词出现的次数,再进行合并就是最终结果。这也是MapRece的基本思想。再比如图片识别应用中给每个图片的摘要信息取唯一标识然后构建散列表,如果图库中有大量图片,单机的hash表会过大,超过单机内存容量。这时也可以使用分片思想,准备n台机器,每台机器负责散列表的一部分数据。每次从图库取一个图片,计算唯一标识,然后与机器个数n求余取模,得到的值就是被分配到的机器编号,然后将这个唯一标识和图片路径发往对应机器构建散列表。当进行图片查找时,使用相同的哈希函数对图片摘要信息取唯一标识并对n求余取模操作后,得到的值k,就是当前图片所存储的机器编号,在该机器的散列表中查找该图片即可。实际上海量数据的处理问题,都可以借助这种数据分片思想,突破单机内存、CPU等资源*。

        *分布式存储 :一致性哈希算法解决缓存等分布式系统的扩容、缩容导致大量数据搬移难题。

         JDK集合工具实现 :HashMap、 LinkedHashMap、ConcurrentHashMap、TreeMap等。Map实现类源码分析,详见  https://www.jianshu.com/p/602324fa59ac

总结

        本文从哈希算法的原理及特点,总结了哈希算法的常见应用场景。

        其中基于余数思想和同余定理实现的哈希算法(除留取余法),广泛应用在分布式场景中(散列函数、数据分片、负载均衡)。由于组合数学中的“鸽巢”原理,理论上不存在完全没有冲突的哈希算法。(PS:“鸽巢”原理是指有限的槽位,放多于槽位数的鸽子时,势必有不同的鸽子落在同一槽内,即冲突发生。同余定理:如果a和b对x取余数操作时a%x = b%x,则a和b同余)

        构造哈希函数的常规方法有:数据分析法、直接寻址法、除留取余法、折叠法、随机法、平方取中法等  。

        常规的解决哈希冲突方法有开放寻址法(线性探测、再哈希)和链表法。JDK中的HashMap和LinkedHashMap均是采用链表法解决哈希冲突的。链表法适合大数据量的哈希冲突解决,可以使用动态数据结构(比如:跳表、红黑树等)代替链表,防止链表时间复杂度过度退化导致性能下降;反之开放寻址法适合少量数据的哈希冲突解决。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 英语冷笑话谐音梗 手机贷款APP借钱花会不会上征信 且贷且花上征信吗 iPhone 6 Plus的airplay在哪里打开? 网上买7十几元的塔罗牌是不是正版 塔罗牌多少钱哟、想买来算算? 塔罗牌便宜和贵的有什么区别吗 雨伞品牌 ES集群存储扩容及在线调整配置 Filebeat+Kafka+ELK生产部署(安全加固) 左右后视镜正确位置图 苏州哪里有做汽车塑料件配套的 有没有信誉好点的厂 有的兄弟告诉我几个 谢谢 关于强化人身保险产品监管工作的通知 谁有锅炉安全操作手册 丰台区哪有手表专卖店 那里可以下载《实用锅炉手册》 北京海淀区有没有沛纳海手表售后 小米电视哪个直播软件好 小米盒子上看高清英超直播,哪个APP比较好 Windows3.2 ISO文件哪里下载?(不是RAR,ZIP)! 准备买盒正官庄的高丽参,在Aha韩国馆选的时候看还有参茶和参丸,参粉,哪种效果更好些? 正官庄的高丽参是买参丸好还是买参茶好泥 正官庄高丽参和加味逍遥丸一起吃行吗? 从人类以及拓扑学这两点来解析的话,“自我逃避”是否是人性的很深甚至是最基本的劣根性?请有识之士为我 拓扑学求教 夏天来了天气热想买个小空调二十平米左右,不知道买什么类型的小空调好,推荐一下价位两百左右的 FAROSBAND注册过商标吗?还有哪些分类可以注册? 硕鼠下载的视频合并后用格式工厂转换后 为什么视频变短了? 六人在电影院,怎么能让她们六个人都有戏呢? 我这算同时追两个女生吗?两个我都没怎么接触过,感觉都有戏,也感觉都没戏。(麻烦看完描述在回答) 现在都有戏怎么都那么大 日语发音 都有戏摩里加 什么意思啊 李雪健老婆发声要公道,梅婷和姚晨发文暗讽,每次白玉兰都有戏,你怎么看? 有什么好玩都有戏(现在) 事业单位而论,到底是内定还是都有戏 魔域星空注册过商标吗?还有哪些分类可以注册? 比亚迪已成功注册仰望商标,并成立仰望汽车销售公司,这么做的目的是什么? 拼多多宇宙科技店是正品吗 宇宙孔牌这个商标怎么样? 综合隆鼻多久可以运动