Hash函数特点:
1.输入域无穷,输出域有限。例如:有无穷多个(在工程中可以具体到多少个,例如1000)输入参数经过hash函数映射后得到有限的输出域{1,2,3,4}。
2.输入参数确定,经过hash函数映射出的返回值一样。(不是随机函数,不同的输入参数可能得到相同的返回值)。
3.输入域上的值经过函数值映射后会几乎均等的分布在输出域上。
补充:得到的输出值%m,也会均匀的分布在0~m上。
经典缓存应用:三台服务器组成集群,要求使三台负载均衡。三台服务器编号0,1,2。服务器可以增加和查询信息,例如可以通过姓名查询出性别,“张三”-“男”。我们为要查询的字符串通过hash函数得到返回值,再用返回值模上3,结果返回0~2之间,所以会均匀分布在0~2之间,服务器实现负载均衡。
但是,这样会有问题,如果增加或减少服务器,原来服务器存储的是模3的结果,加了服务器需要模4,导致原来服务器里面的数据查询混乱。该怎样解决呢?引入一致性hash。既可以负载均衡,又可以删减自由。另外加入虚拟节点技术。我们把三台服务器的唯一记录方式(例如IP、MAC)计算出hash值,通过虚拟节点技术又将每个服务器分成例如1000个虚拟节点,三台服务器总共3000个虚拟节点,将3000个虚拟节点又经过hash函数,拿路由表记录这些数据对应的真实服务器hash值,计算出结果分布到环形上,此时环形上离散且均等分布。此时,如果加入一台服务器,这台服务器就从均匀分布的环形上存储数据,从服务器0上拿一点数据,从服务器1上拿一点数据,从服务器2上拿一点数据,最后实现负载均衡。通过虚拟节点再返回真实的服务器hash值,找出具体服务器。