3

我正在编写一个点对点应用程序,我需要一个散列函数来将 IP/端口对存储在 java 散列集中。我没有重新发明轮子,而是想知道是否已经有解决方案,但谷歌并没有取得太多成果。

任何人都可以推荐一个用于 IPv4 的哈希函数(如果它也适用于 IPv6,那就太好了!)和一个远程端口号?

端口号可能相同,除非客户端位于同一主机上,在这种情况下它将是连续的。

4

2 回答 2

5

String.hashCode()是相当合理的。我会这样做:

int hash = (ip + "/" + port).hashCode();

对于编码目的,它足够“随机”,以至于很多 JDK API 都依赖它。

记住这个口头禅......“少代码是好的”

于 2012-03-13T23:15:53.077 回答
1

ip^port就像你能得到的一样简单

这是相当不错的,因为 IP 号码中的最后几位基本上是随机的(从 ISP 分配 ip)

您可以扩展它ip^port|port>>>16以避免以所有 0 或 1 结尾的问题被避免

对于 IPv6,您需要ipv6_1^ipv6_2^ipv6_3^ipv6_4^portipv6_i作为i第 32 位部分)

你也可以

int hash=17;
hash=hash*5+ip;
hash=hash*5+port;
return hash

或者

int hash=17;
hash=hash*5+ipv6_1;
hash=hash*5+ipv6_2;
hash=hash*5+ipv6_3;
hash=hash*5+ipv6_4;
hash=hash*5+port;
return hash

作为您的标准哈希函数,它比标准 xor 好一点,因为它不是可交换的,如果您感觉更好,您可以更改顺序

于 2012-03-13T23:17:00.543 回答