一致性哈希算法相關問題
来源:1-17 【造轮子】自定义IRule-2
pinkyTseng
2020-10-22 12:06:44
老師 這邊演算法的部分有些地方我不是很確定觀念是否正確 不是很懂 思考整理了以後 想請老師指點迷津一下 萬分感謝
*在route(int hashId, List<Server> addressList) function裡
由url得到的hashId要再做一次我們自己訂的hash是不是因為要和server和其虛擬節點採用一樣的hash算法之後才有辦法排序比較大小 所以才必須再hash一次?
透過 for 0~7 long hash = hash(e.getId() + i) 虚化若干个服务节点到环上 這種方式 會不會讓同一server的節點和其虛擬節點都在圓環上同一區?還是因為下面hash function有先做過MD5了 所以可以避免掉這問題?
*在long hash(String key) function裡
hashCode & 0xffffffffL 這邊需要 & 0xffffffffL 是不是因為一制性哈希本身能容納的就是32位的long整數範圍?
這邊要先取md5是不是也是有一部分是為了上面問題2提到的讓同一server的節點和其虛擬節點 不會 都在圓環上同一區?
最下面圖這段code是不是因為一制性哈希本身能容納的就是32位的long整數,所以透過這段產生一個32位的hashcode?重點只是在產生一個32位的整數?就算想把digest[2]和digest[0]左移的位數互換也ok?
但最下面圖這段code如果是為了產生一個32位的整數,我有點不太懂,因為我的理解是最高位應該是只有一個char digest[2]的8位再左移16位,也就是24位?
是為了最高位bit不能是1(負數)的關係麼?
這樣做最高位的8bit是不是always是0?
還是這邊是我完全理解錯誤?如果是的話,這邊這樣設計的原因和準則是什麼?再請老師指點一下
hashCode = (() (digest[] & << )) | (() (digest[] & << )) | (() (digest[] & ))
3回答
zhouywjava
2021-09-06
4. 我也觉得是24位。然后高8位是0 。最后一步与 32个 1 做与操作只是为了将24位格式化为32 位 。也就是说这个hash 有参与计算的只是 digest 的前面3个byte。 不过我觉得 咱们用 前面N 个byte 也可以吧,反正最后一句都会格式化为32位。
姚半仙
2020-10-23
是的,里层的确实是要采用一样的hash算法
这个是极简版的一致性哈希,只是为了演示算法思想,简单把server放到环上,但是没有很好的控制散列。会存在你说的情况
*在long hash(String key) function裡
只取long值低32位数的意思
是的,尽可能增大散列度,但不是完全间隔相等的一致性哈熟悉
是的,只要32位就可以再多不要,移动位数不要随便换,不然前面&补码要变
这段hash移位没有什么特殊意义,只是增加散列的同时,同方法最后一个32位16进制数与操作,保证即便64位数字也永远是个只有低32位的正数
姚半仙
2020-10-22
我都忘了当时写的啥了,等我翻下源码
相似问题
回答 1
回答 1