hash算法应用场景
哈希算法(Hash Algorithm)在计算机科学中被广泛应用于提供消息摘要、确保数据完整性、加密、数据索引、缓存等多个场景。
以下是一些常见的应用场景:
-
数据完整性校验:
哈希算法可以为数据生成一个固定长度的哈希值,可以用于验证数据的完整性。比如在下载文件时,可以同时获取文件的哈希值,在下载完成后,可以对文件重新计算哈希值,与原始的哈希值比较,如果不匹配,说明文件在传输过程中可能已被篡改或损坏。
-
密码哈希:
在密码存储时,不存储密码的明文,而是存储密码的哈希值。这样即使数据库被黑客攻击,他们也无法获取用户的明文密码。
-
数据索引:
哈希算法可以生成数据的索引,可以用于快速查找和检索。比如在数据库中,可以使用哈希算法来确定数据在磁盘上的位置。
-
缓存:
在数据库查询、网络数据传输等场景中,可以使用哈希算法来确定数据是否有变化,如果没有变化,就可以直接从缓存中读取数据,而不需要重新计算或传输。
-
分布式存储:
在分布式存储系统中,可以使用哈希算法来确定数据应该存储在哪个节点上,以实现数据的分布式存储和访问。
-
去重:
在大数据处理中,可以使用哈希算法来快速去重,即计算每个数据的哈希值,然后去除重复的哈希值,以达到去重的目的。
hash冲突
hash冲突: 在使用hash算法的时候,不同的输入值在通过hash算法函数后得到的hash值相同
常见处理hash冲突方式
1.链地址法(拉链法):这是一种常见的处理冲突的方法,它的基本思想是把哈希表的每一个位置都看做一个桶,当有新的元素hash值冲突时,可以把它添加到同一哈希值的其他元素链表中。适用场景:需要频繁进行插入和删除操作的情况。HashMap就是链表+红黑树来解决哈希冲突的(链表长度大于一定阈值时转为红黑树)
2.开发地址法:将冲突的元素通过某种算法(线性探测、二次探测、双重哈希)存储在哈希表的其他位置上,所有元素都存储在同一个哈希表中,没有额外的链表结构,哈希表的大小与最大存储的元素数量是一致的。但在元素数量接近哈希表大小时,容易发生聚集(Cluster)现象,即冲突的元素趋向于聚集在哈希表的某些区域,导致查找效率下降。为了解决这个问题,可以采用合适的哈希函数、探测规则以及动态调整哈希表大小等策略。适用场景:存储较小量级元素,并且对内存空间要求较高。具体步骤如下:
1.根据哈希函数计算出元素的哈希值
2.如果计算出的位置为空,直接存储元素
3.如果计算出的位置已被占用,根据开放地址法的规则寻找下一个可用的位置
4.重复步骤3,直到找到空槽或遍历完整个哈希表
5.存储元素到找到的位置
3.公共溢出区:哈希表被分为两部分:基本表(或称为主表)和溢出表。基本表用于存储大部分的数据,而溢出表则用于存储那些因为哈希冲突而无法在基本表中找到位置的数据。当一个新的数据项需要被插入哈希表,但是其哈希值对应的位置在基本表中已经被占据时,这个数据项就会被放入溢出表中。这样,即使在基本表中发生哈希冲突,数据项也总是可以被存储在哈希表(基本表+溢出表)中。这种方法的一个优点是它可以有效地处理哈希冲突,而不需要重新计算哈希值或者重新组织哈希表。然而,它也有一个缺点,那就是查找溢出表中的数据项可能会比查找基本表中的数据项要慢,因为溢出表可能会比较大,而且不具有哈希表的直接寻址优势。