一、hash算法
hash算法的实质是对key进行hash,然后将hash后的值对节点个数取模。其运用场景包括hashmap、数据库分库分表等。相对来说,hash算法实现较简单。但是也存在一些问题,比如当节点个数扩容或者减少,那么存在原来节点中的所有数据需要重新对新节点个数取模,分配新的节点位置。如下图所示,假设当前有三个节点,现在有三个key,通过hash(key)%3后,key1路由到node3、key2路由到node2、key3路由到node1。
当增加或者减少node后,key1、key2、key3根据新的节点个数就很难保证还能路由到原来的节点,因此所有的key都会受到影响。
二、一致性hash
2.1 基本思想
hash算法的思想是对节点个数进行取模,一致性hash的思想则是将节点分布到圆环上,圆环的取值范围从0到Integer.MAX_VALUE-1,当对key进行路由时,先计算key的hash值,然后将该值对应到圆环,再顺时针旋转遇到的第一个节点就是路由的节点。如图所示,假设key1,key2,key3经过hash后,hash(key1)落在node3~node1之间,hash(key2)落在node1~node2之间,hash(key3)落在node2~node3之间