2011-12-08 126 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桶的哈希映射可能足够了;尽管该方法可能会使用一些改进。 –