我想找到一個散列函數,它可以提供一些輸出,其值在一定的值範圍內分佈很好。而輸入將是IP地址。Hashing功能,使IP分配給Hbase
我們將IP地址作爲密鑰存儲到HBase中,我的理解是在hbase中使用rowkey將每行分配到不同的區域服務器。如果我們能夠很好地分配IP地址,那麼讀/寫性能應該得到一定程度的改善。
我想找到一個散列函數,它可以提供一些輸出,其值在一定的值範圍內分佈很好。而輸入將是IP地址。Hashing功能,使IP分配給Hbase
我們將IP地址作爲密鑰存儲到HBase中,我的理解是在hbase中使用rowkey將每行分配到不同的區域服務器。如果我們能夠很好地分配IP地址,那麼讀/寫性能應該得到一定程度的改善。
你必須同時處理IPv4和IPv6。幸運的是,您可以將它們中的每一個表示爲整數 - 在IPv4中爲32位,在IPv6中爲128位。
您可以在this question中找到將IP地址轉換爲長整型(或Ipv6長整型數組)的代碼示例。
將IP轉換爲數字之後,對這些值做一個均勻分佈的函數是相當簡單的。最簡單的方法就是按照某個數字(例如區域的數量)取餘數。
很久以前,我已經在解決這個問題。有趣的事實:簡單的哈希函數不提供良好的僞隨機分佈。良好的分佈只能通過非線性或密碼哈希來獲得,如MD5或SHA1。 在我們的解決方案中,我們使用了定製的非線性哈希,如下所示:
// Substitute-box: non-linear transform.
// Must be filled by random values prior to use
uint32_t s_box[256];
uint32_t ip_hash(const uint8_t *ip, uint8_t len) {
uint32_t rc = 0x1f351f35;
while(--len) {
uint8_t x = *ip++;
rc = ((rc << 7) | (rc >> (32-7))) + (s_box[x^(uint8_t)rc]^x);
return rc^(rc >> 16);
}