1.基本概念
哈希也成为“散列”:任意长度的输入,经过哈希算法变换成固定长度的输出。
哈希值会产生碰撞,因为固定长度的哈希值表示的范围是有限的,但输入值的范围是无限的。
通过原始数据通过相同的哈希算法可以计算出相同的哈希值,但是通过哈希值无法恢复原始数据
不同的哈希算法,哈希值长度不同,但相同的哈希算法,哈希值长度固定。哈希值的长度越长越安全。(出现碰撞的概率越低)
2.常用的哈希算法
最简单的哈希算法就是取模运算。比如共有10个数,对9取模,则1至9对9取模的结果分别为1,2,3,4,5,6,7,8,9。10对9取模的结果为1,则1和10经过该哈希运算后结果发生碰撞。
常用的哈希算法包括:MD5、SHA-1、SHA-2等,目前除了SHA-2以外,其他算法都产生过碰撞。
3.哈希算法的用途
可用于:文件校验(验证两个文件是否为同一个文件)、数字签名、鉴权协议等。
4.一致性哈希算法
4.1 要解决什么问题?
在互联网中经常需要对服务器扩容,比如之前有5台服务器,现在要扩容到6台。如果有个数据存储在服务器1(假设数据对5取模结果为N就存储在第N台服务器) ,当服务器从5台扩容至6台,则数据请求将对6取模,其结果将和5取模完全不同,导致缓存服务器全部失效,所有数据都需要直接命中数据库,然后重新缓存,造成大量的性能浪费。为解决这个问题而形成了一致性哈希算法。
4.2 一致性哈希算法的概念
1)将所有缓存数据的哈希值映射到一个圆环上,对应缓存服务器哈希值也映射到该圆环上。
2)计算所要缓存的数据的哈希值并在该环上映射,然后顺时针查找到的第一个缓存服务器,然后就在这个服务器上缓存该数据。假设有5个缓存服务器,分别处于圆环的pos1~5。要缓存的数据哈希值映射在圆环上,并顺时针查找到服务器3,则该数据缓存至服务器3
3) 在请求数据时,现在缓存服务器中查找。计算要请求的数据的哈希值,并应设在圆环上。顺时针查找第一个服务器得到服务器3,则在该服务器中查找缓存数据。如果没有再查找服务端数据库。
4)服务器扩容,增加服务器6,哈希值的位置在服务器2和服务器3之间,位置为pos6。在此查找相同的数据,如果该数据的哈希值映射在pos6和pos3之间,则依然可以顺时针找到服务器3,并从服务器3中查找数据。缓存的数据不会失效。如果该数据的哈希值映射在pos2和pos6之间,则顺时针找到的是服务器6,而不是之前缓存该数据的服务器3,则在服务器6上不会找到该数据。这样该数据的缓存就失效了。
通过上述一致性哈希算法,可以大大降低服务器扩容造成的损失。现在可通过将一台服务器虚拟出多个虚拟服务器并映射在圆环上来答复降低扩容损失。
由于个人的理解优先,希望大家批评指正。