将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。
一个优秀的哈希算法的要求:
- 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法);
- 对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同;
- 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小;
- 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。
为什么哈希算法无法做到零冲突?
鸽巢原理(抽屉原理):如果有 10 个鸽巢,有 11 只鸽子,那肯定有 1 个鸽巢中的鸽子数量多于 1 个
哈希算法产生的哈希值的长度是固定且有限的,但是要哈希的数据是无穷的,必然会出现散列冲突
一般情况下,哈希值越长的哈希算法,散列冲突的概率越低
哈希算法应用-安全加密
MD5(MD5 Message-Digest Algorithm,MD5 消息摘要算法)
SHA(Secure Hash Algorithm,安全散列算法)
DES(Data Encryption Standard,数据加密标准)
AES(Advanced Encryption Standard,高级加密标准)
加密就是利用了从哈希值不能反向推导出原始数据的特性(但也不是完全不可破解,只是破解的代价太高)
哈希算法应用-唯一标识
哈希算法应用-数据校验
哈希算法应用-散列函数
哈希算法应用-负载均衡
会话粘滞(session sticky)的负载均衡算法:同一个客户端上,在一次会话中的所有请求都路由到同一个服务器上
可以通过哈希算法,对客户端 IP 地址或者会话 ID 计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号
就可以把同一个 IP 过来的所有请求,都路由到同一个后端服务器上
