2011-12-08 99 views
2

我需要根據IP地址和端口號計算出來的散列值。我發現了下面的例子,通過跟蹤,我可以看到它返回一個三位數的散列值,這對我來說很好。 但是,我想知道發生了什麼更詳細的一點,我很難搞清楚。按位操作解剖

這裏是代碼片段:

((addr.s_addr^(addr.s_addr>>8)^ntohs(port) & 255); 

addr.s_addr是一個無符號長(32位)。 端口無符號短(16位)。

IP地址值192.168.50.70和端口號60049返回散列值249(當打印出%d時)。

任何人都可以幫助我理解操作實際上做了什麼? :)

謝謝。

親切的問候 安德烈亞斯

回答

0

這也極大的奧祕,它異或(^)adds.s_addr與自身位移8個空格的權利;然後將它與端口號進行比較,最後將整個事情與255進行比較,以將其限制爲8個字節。

+0

......這實際上是非常糟糕的:只有最右邊的16位IP地址參與哈希(如果地址限制爲192.168.xy,這很好),並且只有portnum的8個最右邊的位參與散列值。但它可能**對於特定的應用程序足夠好。 – wildplasser

+0

嗯,對於一個256桶的哈希映射可能足夠了;儘管該方法可能會使用一些改進。 –