将IP地址映射到数组索引

时间:2015-10-12 03:32:37

标签: c arrays algorithm data-structures

我正在寻找一种将IP地址映射到数组中索引的好方法。假设我有一个32位大小的数组和最大可能的IP地址,我们可以从用户那里得到的输入总是< = 32.我想将这个IP地址映射到数组中的某个索引位置,并从中使用此索引位置引用此IP地址。

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

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

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您是否期望针对您的问题提供任何哈希算法参考?

因为数组大小为32。

您可以使用IP地址中的设置位数来索引数组位置。但是所有0和全部1都没有使用地址,因此您将失去2个位置。 您可以使用所有半字节的总和来检查,忽略哈希的进位。您可以根据数组大小增加添加的位数。

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

对于碰撞情况,您需要有一个指针数组而不是一维数组,这样您就可以存储多个具有相同散列的地址。

答案 1 :(得分:0)

没有哈希函数可以实现这一点。哈希函数仅将ip地址作为参数,而您需要了解其他元素才能完成您想要的任务:如果您有32个位置且>对于元素,32个可能的值,任何哈希函数都必须存在冲突。

如果可行,则hashmap实现不必考虑冲突,直到大小大于底层数组的最大大小。他们确实考虑到了:))

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

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

如果您使用此功能,请记住使用2的幂来使其生效。 Java从16开始,增加到32,64等。