我正在编写一个对等应用程序,我需要一个哈希函数来存储java哈希集中的IP /端口对。我没有重新发明轮子,而是想知道是否已有解决方案,但谷歌并没有产生太大的影响。
任何人都可以推荐IPv4的哈希函数(如果它也适用于IPv6,也可以使用!)和远程端口号?
端口号可能相同,除非客户端位于同一主机上,在这种情况下它将是顺序的。
答案 0 :(得分:5)
String.hashCode()
非常合理。我只想这样做:
int hash = (ip + "/" + port).hashCode();
它足够“随机”用于编码目的,以至于大部分JDK API都依赖它。
记住这句咒语......“代码越少越好”
答案 1 :(得分:1)
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好一点,因为它不是可交换的,如果你感觉更好,你可以改变顺序