一致性哈希算法相關問題
老師 這邊演算法的部分有些地方我不是很確定觀念是否正確 不是很懂 思考整理了以後 想請老師指點迷津一下 萬分感謝
*在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[] & ))
正在回答 回答被采纳积分+1
4. 我也觉得是24位。然后高8位是0 。最后一步与 32个 1 做与操作只是为了将24位格式化为32 位 。也就是说这个hash 有参与计算的只是 digest 的前面3个byte。 不过我觉得 咱们用 前面N 个byte 也可以吧,反正最后一句都会格式化为32位。
相似问题
登录后可查看更多问答,登录/注册
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星