有什么好的算法可以计算(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核心的数据包进行负载平衡?
答案 0 :(得分:2)
您可以将输入连接为字符串,然后使用任何常用的哈希函数(例如SHA-1),该函数速度很快(在现代PC上,每秒约有10-3000万个哈希)。您可以将值连接为字节而不是字符串,但这并不重要(例如,对于SHA-1,56字节以下的任何内容都是一个块)。
如果计算资源有限并且需要更高的速度,则可以使用CRC32或类似xxHash或MurmurHash的东西。一些现代的CPU支持crc32c
指令,然后每个内核每秒的吞吐量高达10亿哈希。
您也可以使用Toeplitz哈希,但是它确实很原始,而且发生冲突的可能性更高。