2011-07-20 48 views
2

我正在使用Python-2.6。我對散列函數知之甚少。將IP地址散列到[0,H)

我想使用CRC哈希函數來將'128.0.0.5'之類的IP地址散列到[0,H)範圍內。目前我正在考慮做

zlib.crc32('128.0.0.5')%H. 

這樣好嗎?有幾個問題。你可以嘗試和回答...

  • 它做任何區別。如果我散列'128.0.0.5'或它的二進制'0001110101010 ..''無論有沒有'。'的

  • zlib.crc32返回一個有符號的整數。修改(%)否定。積極的H總是給一個pos否?

  • %-ing by H是否會影響散列函數的良好性能? (我的意思是,我可以做的最好的可用空間,可用的xlib.crc32)

謝謝!

+0

H有多大,你想如何處理碰撞? –

+0

IP地址已經是一個無符號的32位整數。你試圖用這個來達到什麼目的? – Keith

+0

我哈希因爲我不想使用32位來存儲IP地址,而只是記錄(H,2),而且我會對哈希值做更多的事情,我希望它們是隨機。 H將使用遠少於32位,大約8或10. – Lavanya

回答

1

不作出任何差異。如果我散列'128.0.0.5'或它的二進制'0001110101010 ..''不管有沒有'。'的

不是真的。

zlib.crc32返回一個有符號整數。修改(%)否定。積極的H總是給一個pos否?

是的。

%-ing by H是否會影響散列函數的良好性能? (我的意思是,我可以爲可用空間做到最好,與現有的xlib.crc32)

你最好使用校驗和的所有位來彌補自己的不足的「雪崩效應」。一位數的變化例如192.168.1.1,192.168.1.2等可能僅在校驗和的前幾位產生差異,並且由於%只關心最後一位,所以散列將發生衝突。

1

ad 1)它會產生不同的結果,但不會影響散列的質量。

ad 2)它總會產生一個正數或零。

ad 3)由於您限制了可能的桶數,它確實會影響哈希的質量。

總的來說:你的H有多大?請記住,IPv4地址不過是一個32位值。 192.168.0.1只是一種更人性化的按字節表示方式。所以如果你的H大於4294967295,就不需要散列。

+0

謝謝,我的H將會更小,機率。約2 ** 8左右。 – Lavanya

3

爲什麼你想散列一個IP地址到一個數字?他們已經有一個本地整數表示。例如,使用netaddr

>>> import netaddr 
>>> ip = netaddr.IPAddress('192.168.1.1') 
>>> ip.value 
3232235777 
>>> netaddr.IPAddress(3232235777) 
IPAddress('192.168.1.1') 
+0

+1根本不使用散列。也會給+1使用netaddr太 –

+0

我哈希因爲我不想使用32位來存儲IP地址,而只有日誌(H,2),我會做更多的東西來哈希值,我希望它們是隨機的。雖然我不知道netaddr。看起來它將IP地址從「base 256」改爲base 10,整潔! – Lavanya

+0

如果你想把一個32位的數字散列成更小的數字,你將會像其他人所建議的那樣失去分辨率。 netaddr模塊沒有任何技巧,只是提供了一個Python接口。整個IPv4地址範圍(0.0.0.0-255.255.255.255)分別表示0-4294967295(2 ** 32)的無符號32位整數。除了每個整數是128位(2 ** 128)之外,IPv6也是如此。 – jathanism