【问题标题】:Mapping IP addresses to array index将 IP 地址映射到数组索引
【发布时间】:2015-10-12 03:32:36
【问题描述】:

我正在寻找一种将 IP 地址映射到数组中的索引的好方法。假设我有一个大小为 32 的数组,我们可以从用户那里获得的最大可能 IP 地址始终为

这样做的最佳技术是什么。 IP 地址本质上只是一个整数。如果两个地址映射到相同的索引位置,也需要处理冲突。

ip1 => 转换为某个整数,比如 i1 => 索引现在只是 i1 % 32

任何适合此用例以转换 IP 地址的散列技术也很有用。

感谢您的帮助。

【问题讨论】:

  • 再一次(这似乎是一个很常见的混淆),c 和 c++ 是非常不同的语言。我相信可能的解决方案会非常不同。但无论如何,你的问题太宽泛了。也许如果你解释一下这个原因?
  • 考虑使用std::unordered_map

标签: c arrays algorithm data-structures


【解决方案1】:

您是否期待任何散列算法参考来解决您的问题?

因为您的数组大小为 32。

您可以只使用 IP 地址中的设置位数来索引数组位置。但是所有 0 和所有 1 都不是使用地址,因此您丢失了 2 个位置。 您可以使用所有半字节的总和来检查,而忽略散列的进位位。您可以根据数组大小增加添加的位数。

您也可以将哈希值仅基于 IP 地址的 2 个字节,因为单个子网中的高位字节可能相同。

如果发生冲突,您需要一个指针数组而不是一维数组,这样您就可以存储具有相同哈希的多个地址。

【讨论】:

  • 谢谢。是的,我正在寻找适合此用例的任何散列算法。
【解决方案2】:

不可能有一个散列函数使这成为可能。哈希函数仅将 ip 地址作为参数,而您需要了解其他元素才能完成所需的操作:如果您的元素有 32 个位置和 > 32 个可能的值,则任何哈希函数都必须存在冲突。

如果这是可能的,hashmap 实现将不必考虑冲突,直到大小大于底层数组的最大大小。他们确实认为:)

了解 java hashmap 如何将哈希码映射到底层数组的索引可能会有所帮助:

static int  indexFor(int h, int length) {
     return h & (length-1);
 }

如果您使用它,请记住使用 2 的幂来使其有效。 Java 从 16 开始,增加到 32、64 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多