src dest ip + port的哈希函数

cre*_*wit 9 c hash networking hashtable

所以,我正在研究用于散列4元组ip和端口以识别流的不同散列函数.

我遇到的一个是

((size_t)(key.src.s_addr) * 59) ^
((size_t)(key.dst.s_addr)) ^
((size_t)(key.sport) << 16) ^
((size_t)(key.dport)) ^
((size_t)(key.proto));
Run Code Online (Sandbox Code Playgroud)

现在对于我的生活,我无法解释使用的素数(59).为什么不是31,然后为什么要通过将运动乘以2的幂来弄乱它.是否有更好的哈希函数用于IP地址?

Bri*_*eon 12

使用素数是因为当一个值乘以素数时,当其他类似操作累积在其上时,它往往具有更高的保持唯一的概率.特定值59可以是任意选择的,也可以是有意的.这很难说.有可能59倾向于根据最可能的输入生成更好的值分布.

移位16可能是因为端口限制在2 ^ 16的范围内.该功能似乎是将源端口移动到位域的较高部分,同时将目标端口保留在下部.我认为这可以在我的下一段中进一步解释.

乘法发生的另一个原因(并且这也适用于移位操作)是因为它打破了散列函数的关联性质.请记住,XOR是关联的,因此如果乘法不存在,则IP src = 192.168.1.1和dst = 192.168.1.254将散列为与src = 192.168.1.254和dst = 192.168.1.1(交换)相同的值.