从(192.168.0.1,34829,80.229.161.151,80,6)计算哈希的一些好算法是什么,我可以使用这些算法在哈希表中查找连接?
192.168.0.1:34829 -> 80.229.161.151:80
(3232235521, 34829, 1357226391, 80, 6)我在这篇文章中读到,一种流行的方法是将整数相加,然后是mod N,其中N是最大连接数。
3232235521 + 34829 + 1357226391 + 80 + 6 = 4589496827 mod 65536 = 10747但是,这将与以下内容发生冲突:
3232235521 + 34818 + 1357226391 + 80 + 17 = 4589496827 mod 65536 = 10747这样做会不会更好?
3232235521 ⊕ 34829 ⊕ 1357226391 ⊕ 80 ⊕ 6 mod 65536只是为了确保以下TCP连接是不可能的,因为源端口80不可用,因为它已经在该主机上处于侦听模式?
80.229.161.151:80 ->192.168.0.1:34829
(1357226391, 80, 3232235521, 34829, 6)我可以使用toeplitz散列吗?或者这只是为了将数据包负载均衡到cpu核心?
发布于 2018-08-21 08:47:37
您可以将输入连接为字符串,然后使用任何常见的散列函数,如SHA-1,它速度很快(在现代PC上,每秒约有1000-3000万个散列)。您可以将值连接为字节而不是字符串,但这并不重要(例如,在SHA-1的情况下,任何低于56字节的值都是1块)。
如果您的计算资源有限,并且需要更高的速度,您可以使用CRC32或xxHash或MurmurHash之类的工具。一些现代CPU支持crc32c指令,因此每个内核的吞吐量高达每秒10亿个哈希。
你也可以使用Toeplitz散列,但它确实很原始,而且更有可能发生冲突。
https://stackoverflow.com/questions/51937753
复制相似问题