所以,我正在研究用于散列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地址?
这是一个设计问题,一直困扰着我一段时间.实际上非常简单,当您提供数据结构库时,您是构建线程安全原语还是仅提供构造并让系统使用它来决定如何实现实际操作.
一个简单的例子,一个支持Producer,Consumer模型的循环缓冲区.2方法,获取和写入,每个更新全局变量填充计数.现在,您是否只是提供互锁来锁定并让使用缓冲区的代码获取互斥锁,或者在内部进行锁定并提供开箱即用的互斥.
STL似乎采取外部方法,但有性能原因,为什么你想要提供更细粒度的锁定.
想法?