我正在编写一个点对点应用程序,我需要一个散列函数来将 IP/端口对存储在 java 散列集中。我没有重新发明轮子,而是想知道是否已经有解决方案,但谷歌并没有取得太多成果。
任何人都可以推荐一个用于 IPv4 的哈希函数(如果它也适用于 IPv6,那就太好了!)和一个远程端口号?
端口号可能相同,除非客户端位于同一主机上,在这种情况下它将是连续的。
我正在编写一个点对点应用程序,我需要一个散列函数来将 IP/端口对存储在 java 散列集中。我没有重新发明轮子,而是想知道是否已经有解决方案,但谷歌并没有取得太多成果。
任何人都可以推荐一个用于 IPv4 的哈希函数(如果它也适用于 IPv6,那就太好了!)和一个远程端口号?
端口号可能相同,除非客户端位于同一主机上,在这种情况下它将是连续的。
这String.hashCode()
是相当合理的。我会这样做:
int hash = (ip + "/" + port).hashCode();
对于编码目的,它足够“随机”,以至于很多 JDK API 都依赖它。
记住这个口头禅......“少代码是好的”
ip^port
就像你能得到的一样简单
这是相当不错的,因为 IP 号码中的最后几位基本上是随机的(从 ISP 分配 ip)
您可以扩展它ip^port|port>>>16
以避免以所有 0 或 1 结尾的问题被避免
对于 IPv6,您需要ipv6_1^ipv6_2^ipv6_3^ipv6_4^port
(ipv6_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 好一点,因为它不是可交换的,如果您感觉更好,您可以更改顺序