C++ 需要一个哈希函数从ipv6 16字节地址和TCP 2字节端口号中创建32位值

C++ 需要一个哈希函数从ipv6 16字节地址和TCP 2字节端口号中创建32位值,c++,c,networking,network-programming,ipv6,C++,C,Networking,Network Programming,Ipv6,我想创建一个32位的散列值。我有16字节的源和目标ipv6地址以及2字节的源和目标端口号 32位输出=(Src IP、Dst IP、Src端口、Dest端口) 如果哈希函数沿着32位空间很好地分布实体,则效果会更好。我想将结果用作索引 Resit有关哈希函数和几种著名算法的一般信息,请参阅;我可能会选择FNV或Jenkins的一次一个散列。另一个,可能是有用的参考: 请注意,很难生成无冲突保证的哈希函数(相同哈希代码中没有不同的输入结果)。这个问题有很多解决方案,最简单的是开放寻址 索引的3

我想创建一个32位的散列值。我有16字节的源和目标ipv6地址以及2字节的源和目标端口号

32位输出=(Src IP、Dst IP、Src端口、Dest端口)

如果哈希函数沿着32位空间很好地分布实体,则效果会更好。我想将结果用作索引


Resit

有关哈希函数和几种著名算法的一般信息,请参阅;我可能会选择FNV或Jenkins的一次一个散列。

另一个,可能是有用的参考:

请注意,很难生成无冲突保证的哈希函数(相同哈希代码中没有不同的输入结果)。这个问题有很多解决方案,最简单的是开放寻址


索引的32位?你的桌子有多大

考虑到大多数IPv6地址将基于硬件地址。看看:

在这种情况下,尝试这种在大多数情况下都有效的快速而肮脏的攻击(假设端口和MAC地址分布均匀):

  • 取源IPv6地址的低16位。将其向左移动16位,或与目标IP地址的较低16字节一起移动
  • 以源端口为例。将其向左移动16位,或与目标端口一起移动
  • 将上述两个32位值的结果进行异或运算

如果用户使用的是手动分配的地址,这个散列函数的分布不会很均匀,但我认为在大多数情况下,它会很接近。如果您愿意,您可以从地址的上半部分插入(XOR)一些位。

非常快,据我所知,非常受欢迎。这不是加密强度,但它应该足以满足您的目的。

高性能是一项要求吗?为什么不使用MD5或SHA-1并切掉不需要的位?虽然,我必须说,那会浪费很多信息。或者您是否有任何其他要求,如速度或内存消耗?@RedX-see^^^高性能是一项要求:)是的,高性能很重要。这将用于网络应用程序中。简单性也很重要。我不希望它是一个复杂的算法/代码。它不需要有一个完美的分布。这是非常有帮助的。我没有考虑IPv6地址的创建过程。我不使用32位索引。我们的算法非常简单,它计算一个32位的值,然后根据缓冲区的大小取输出模块。我不知道它有多有效,但它确实有效。问题是,我想对128位和32位输入索引使用相同的哈希表。谢谢,通用哈希函数算法似乎是一种可行的方法。我将试验他们的算法。
[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|
+----------------+----------------+----------------+