我正在寻找一种将IP地址映射到数组中索引的好方法。假设我有一个32位大小的数组和最大可能的IP地址,我们可以从用户那里得到的输入总是< = 32.我想将这个IP地址映射到数组中的某个索引位置,并从中使用此索引位置引用此IP地址。
这样做的最佳技巧是什么。 IP地址基本上只是一个整数。如果两个地址映射到相同的索引位置,则还需要处理冲突。
ip1 =>转换为某个整数,例如i1 =>索引现在只是i1%32
任何适合此用例转换IP地址的散列技术也很有用。
感谢您的帮助。
答案 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等。