【问题标题】:Need a hash function to create 32 bit value out of ipv6 16 Byte address and TCP 2 Byte port numbers需要一个哈希函数从 ipv6 16 字节地址和 TCP 2 字节端口号中创建 32 位值
【发布时间】:2011-09-25 17:54:18
【问题描述】:

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

32 位输出 = (Src IP,Dst Ip,Src Port,Dest Port)

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

重新开始

【问题讨论】:

  • 是否需要高性能?
  • 为什么不使用 MD5 或 SHA-1 并删除不需要的位?虽然,我必须说,这会浪费很多信息。或者您还有其他要求,例如速度或内存消耗?
  • @RedX - 见 ^^ 是高性能要求 :)
  • 是的,高性能很重要。这将用于网络应用程序。简单也很重要。我不希望它是一个复杂的算法/代码。它不必具有完美的分布。

标签: c++ c networking network-programming ipv6


【解决方案1】:

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

General Purpose Hash Function Algorithms

CityHash by Google

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

Open Addressing

【讨论】:

  • 谢谢,通用哈希函数算法似乎是要走的路。我将试验他们的算法。
【解决方案2】:

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 地址分布均匀):

  • 取源 IPv6 地址的低 16 位。将其向左移动 16 位,然后与目标 IP 地址的低 16 字节进行或运算
  • 获取源端口。将其向左移动 16 位,然后与目标端口进行或操作
  • 将以上两个 32 位值的结果进行异或运算

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

【讨论】:

  • 这很有帮助。我没有考虑ipv6地址的创建过程。我不使用 32 位索引。我们的算法非常简单,它计算一个 32 位的值,然后我们根据缓冲区的大小获取输出模块。我不知道它有多有效,但它确实有效。问题是,我想对 128 位和 32 位输入索引使用相同的哈希表。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    murmurhash 速度非常快,而且相当受人尊敬,据我所知。这不是加密强度,但应该足以满足您的目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 2017-11-05
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多