快速上手 C++ 数据结构与算法
王健伟
《C++ 新经典》系列作者,资深 C++ 讲师
3234 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
结束语 (1讲)
快速上手 C++ 数据结构与算法
15
15
1.0x
00:00/00:00
登录|注册

46|哈希表与哈希算法:字符串的MD5值是通过哈希算法得到的?

你好,我是王健伟。
上节课我们在讲解哈希函数的设计方法中提到了“哈希冲突”这个词。
通常来说,在传递给哈希函数不同的参数但返回的哈希值是相同的整数时,就产生了哈希冲突。
这节课,我们就谈一谈如何解决哈希冲突。

如何解决哈希冲突?

哈希冲突无法完全避免,尤其是数组大小是有限的,就更容易发生哈希冲突。所以问题的重点在于一旦遇到哈希冲突该如何解决。
哈希冲突解决方法比较多,比如链表法、开放地址法、公共溢出区法等。我们一个一个来说。

链表法 / 拉链法 / 链地址法(Chaining)

这是一种很常用的哈希冲突解决方法,比较简单。在哈希表所代表的数组中,每个数组元素称为“桶”(bucket)或 “槽”(slot)或“篮子(basket)”。每个桶 / 槽 / 篮子会对应一个链表,桶代表这个链表的链表头。将这些哈希值相同的元素放到相同桶对应的链表中,如图 1 所示:
图1 链表法解决哈希冲突(顺序表+链表)
当向哈希表中插入数据的时候,通过哈希函数计算出对应的桶位,将数据插入到桶对应的链表中即可。此时插入的时间复杂度为 O(1)。当在哈希表中查找和删除数据时,可以通过哈希函数计算出桶位,然后就可以通过遍历对应的链表进行查找和删除工作,查找和删除的时间复杂度取决于链表中元素个数,如果链表中元素个数(链表长度)为 k,则时间复杂度为 O(k)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

哈希表与哈希算法是解决哈希冲突的关键技术。哈希冲突是指当不同参数传递给哈希函数时返回相同的哈希值。文章介绍了解决哈希冲突的方法,包括链表法和开放地址法。链表法通过将哈希值相同的元素放入同一链表中解决冲突,适合存储大数据对象和频繁插入删除数据的情况。而开放地址法则通过重新寻找空闲位置并插入数据来解决冲突,包括线性探测法、二次探测法、双哈希法和伪随机序列法。此外,文章还介绍了公共溢出区法,即将冲突的数据放入溢出表中,适用于冲突数据较少的情况。总的来说,哈希函数的设计和哈希算法的选择对于解决哈希冲突至关重要,需要保证哈希值均匀分布且算法简单高效。 在哈希表的实现中,装载因子的概念被提及,指出了装载因子与哈希冲突的关系,以及在哈希表中保持一定比例的空闲槽位的重要性。此外,对于哈希表的扩容和缩容也进行了详细的讨论,强调了在数据变动频繁的情况下,合理的扩容和缩容策略对于维护哈希表性能的重要性。 文章还介绍了哈希算法的主要应用领域,包括安全加密、唯一标识、数据校验等。特别是在安全加密领域,MD5算法的应用得到了详细的阐述,强调了其在密码存储和校验中的重要性。此外,还提到了哈希算法在数据校验和唯一标识领域的应用,以及在分布式系统中的多种应用。 综上所述,本文全面介绍了哈希表与哈希算法的原理、实现和应用,对于读者快速了解哈希技术的基本概念和应用具有重要参考价值。文章内容涵盖了哈希冲突解决方法、哈希表实现中的关键概念、哈希表的扩容和缩容策略以及哈希算法在安全加密、唯一标识和数据校验领域的应用,为读者提供了全面的技术知识和应用指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快速上手 C++ 数据结构与算法》
新⼈⾸单¥68
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部