這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
3.go開源groupcache項目——consistenthash代碼
Consistenthash代碼是提供ring hash的實現。
包含兩個檔案consistenthash.go和consistenthash_test.go。
包名叫做consistenthash
定義了一個Hash 函數,一個Map結構體。
1 Map結構體
定義一個hash變數,為函數返回不帶正負號的整數
一個INT的變數
一個INT數組
和一個map類型變數hashMap.
2 New函數
入參為一個整形和一個函數。
整形replicas作用是往裡add的時候需要複製的數量,其實也是多少鍵映射一個雜湊值的含義在裡面。
建立一個Map結構體。其中結構體中的hashMap使用make建立。
如果函數為nil,則賦值為crc32.ChecksumIEEE
3 IsEmpty函數
判斷Map結構體中keys的數量是否為0.
4 Add函數
入參為可變字串。
將鍵增加到hash中。
通過range來擷取入參,然後
將入參根據定義的雜湊函數進行雜湊得到雜湊值。
將Map結構體中的keys整形數組增加一個值,該雜湊值。
同時將入參變數加入到Map結構體中的hashMap變數中(map結構體),入參為鍵,雜湊值為索引值。
5 Get函數
入參為一個索引值(字串),根據提供的鍵來擷取接近的字串。
先判斷是否為空白。
然後根據根據字串來計算得到雜湊值。
然後根據sort包中的search函數,Search()方法使用“二分尋找”演算法來搜尋某指定切片[0:n],並返回能夠使f(i)=true的最小的i(0<=i<n)值,並且會假定,如果f(i)=true,則f(i+1)=true,即對於切片[0:n],i之前的切片元素會使f()函數返回false,i及i之後的元素會使f()函數返回true。但是,當在切片中無法找到時f(i)=true的i時(此時切片元素都不能使f()函數返回true),Search()方法會返回n(而不是返回-1)。
如果沒找到,則返回0.
最後返回Map結構體中hashMap變數中的對應的雜湊值。