我想创建一个32位的哈希值。我有16个字节的源和目的ipv6地址以及2个字节的源端口号和目的端口号。
32位输出=(源IP、Dst Ip、源端口、目标端口)
如果散列函数沿着32位空间很好地分布实体,那就更好了。我想使用结果作为索引。
重坐
发布于 2011-06-30 16:01:27
另一个,可能是有用的参考:
General Purpose Hash Function Algorithms
CityHash by Google
请注意,很难创建一个无冲突保证的散列函数(在相同的散列代码中没有不同的输入结果)。解决这个问题的方法有很多,最简单的就是开放寻址。
Open Addressing
发布于 2011-07-07 08:10:39
32位的索引?你的桌子有多大?!
考虑到大多数IPv6地址将基于硬件地址。看一看RFC 4291
[EUI64] defines a method to create an IEEE EUI-64 identifier from an
IEEE 48-bit MAC identifier. This is to insert two octets, with
hexadecimal values of 0xFF and 0xFE (see the Note at the end of
appendix), in the middle of the 48-bit MAC (between the company_id
and vendor-supplied id). An example is the 48-bit IEEE MAC with
Global scope:
|0 1|1 3|3 4|
|0 5|6 1|2 7|
+----------------+----------------+----------------+
|cccccc0gcccccccc|ccccccccmmmmmmmm|mmmmmmmmmmmmmmmm|
+----------------+----------------+----------------+在这种情况下,尝试这个在大多数情况下都有效的快速而肮脏的方法(假设端口和MAC地址均匀分布):
如果用户使用手动分配的地址,这个散列函数将不会非常均匀地分布,但我认为在大多数情况下它会很接近。如果需要,您可以从地址的上半部分添加(XOR)一些位。
发布于 2011-06-30 15:33:42
有关散列函数和几种著名算法的一般信息,请参阅Eternally Confuzzled;我可能会使用FNV或Jenkins的一次一个散列。
https://stackoverflow.com/questions/6531147
复制相似问题