当前位置: 首页 > 科技观察

一篇文章看懂Hash算法及其应用场景

时间:2023-03-14 00:30:49 科技观察

1.什么是哈希算法Hash和hash都是从单词hash而来,前者是音译,后者是意译。它是一种可以将任意长度的二进制值映射为定长二进制值的算法,映射后的定长二进制值称为哈希值。一个优秀的散列算法需要满足以下要求:不能从散列值反推原始数据;它对输入数据非常敏感,不同的位会导致非常不同的散列值;hash碰撞的概率一定是很小的;哈希算法的计算过程要足够简单高效,即使原始数据很长,也能快速得到哈希值;2、哈希算法的使用场景2.1安全加密常用的哈希加密算法有MD5(MD5Message-DigestAlgorithm,MD5消息摘要算法)和SHA(SecureHashAlgorithm,安全哈希算法)。不能从哈希值密文推导出明文密码,哈希碰撞概率比较小。这两点保证了哈希算法作为安全加密方法的可靠性。为什么hash算法不能完全避免hash冲突,只能尽量减少hash冲突?鸽笼原理告诉我们,如果11只鸽子飞进10个鸽笼,那么一定有一个鸽笼里有2只或更多的鸽子。那么hash值是固定长度的,这就决定了hash值是可以被穷尽的,但是理论上原始数据是无穷无尽的,所以肯定会发生hash碰撞。本应用场景利用了哈希算法的特性1和3,其中3保证了密码很难被正向破解(以MD5为例,哈希值长度为128位,有2^128个不同的哈希希腊值,很难被破解)。安全领域没有绝对的安全。MD5虽然很难破解,但还是有办法破解的。例如,使用彩虹表匹配可以轻松破解常见密码。因此,我们一般采用saltedhash算法进行安全加密。加盐的方法需要严格保密,大大增加了破解的难度和成本。2.2唯一标志我们在验证两个文件是否相同时,不能简单的通过文件名来判断。因为同名文件的存在太普遍了。我们可以根据特定的规则从大文件中取出一些二进制数据,通过哈希算法得到哈希值作为文件的唯一符号。此类相同的文件必须具有相同的哈希值,即相同的唯一标识符;不同的文件很有可能具有不同的哈希值唯一标识符;即使发生了hash冲突,我们也可以再详细比较两个文件的所有二进制数据,进一步判断是否是同一个文件,这个事件发生的概率太小了。但这种方案既保证了高效率,又保证了可靠性。本应用场景使用了哈希算法的特征2和3。2.3数据验证在P2P下载协议中,我们会从不同的机器上下载同一部电影的不同部分,然后在自己的机器上组装电影。如果电影的某一部分在下载过程中出现错误或内容被篡改,可能会导致下载错误或病毒。因此,我们首先对所有部分进行哈希处理,并将它们保存在种子文件中。下载完所有部分后,我们对所有部分进行哈希计算,得到哈希值,然后与种子文件中的哈希值进行比较,验证文件是否完整。本应用场景使用了哈希算法的特征2和4。2.4哈希函数这个场景在我们讲哈希表的时候已经介绍过了。这种场景下,对特征1的要求不是很高,对特征2的要求是哈希值要尽量均匀分布。Feature3在一定程度上也可以接受冲突,可以使用openaddressing方式和zipper方式解决,就是Feature4要求高一点,需要追求性能。2.5负载均衡负载均衡的算法有很多,如roundrobin、random、weightedroundrobin等,但目标是实现一个sessionsticky负载均衡算法,即同一个client在一个session期间的所有请求被路由到同一台服务器。我们可以对客户端的IP或sessionID进行哈希计算,将得到的哈希值与服务器数量进行取模运算。最后的值就是需要路由的服务器,这样就可以达到会话粘性的目的。2.6数据分片当我们需要处理海量数据时,单台服务器无法加载和计算如此海量的数据,因此需要将海量数据平均分配给N台服务器进行并行计算。如何将数据均匀分布到N台服务器呢?我们对数据进行哈希计算,用得到的哈希值对服务器数量N取模,结果相同的数据会分配到同一台服务器上,交给这台服务器处理。N台服务器并行处理海量数据,最后合并结果。2.7分布式存储将海量数据存储在分布式缓存或分布式数据库中。借用的思路和上面的数据分片类似。但是,原先设置的服务器数量不够怎么办?不是简单的增加几台机器就能解决的,会破坏哈希值的取模运算,导致缓存穿透,造成雪崩效应。同样,当机器故障被排除后,它会导致同样的问题。这时候就需要使用一致性哈希算法来解决这个问题。一致性哈希算法简单来说就是在环上构造一个有2^32个节点的哈希环,将服务器IP和文件哈希计算映射到对应的节点上。所有文件顺时针遇到的第一个服务器是存储它们的服务器。这样,在添加或删除某个服务器时,可以控制受影响文件的数量,而不会造成全局雪崩。哈希环但是,有一定的概率,当服务器IP映射到哈希环时,会出现哈希环倾斜的问题。雪崩效果场景。哈希环的倾斜我们可以人为地在这些服务器上添加几个虚拟节点,使所有服务器节点均匀分布在哈希环上。具有虚拟节点的哈希环3.总结Hash算法的使用场景远不止上面这些,比如CRC校验。