首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将IP地址映射到阵列索引

将IP地址映射到阵列索引
EN

Stack Overflow用户
提问于 2015-10-12 11:32:37
回答 2查看 309关注 0票数 0

我正在寻找一种将IP地址映射到数组中索引的好方法。假设我有一个32个大小的数组,我们可以从用户输入的最大可能IP地址将始终是<= 32。我想将此IP地址映射到数组中的某个索引位置,然后使用此索引位置来引用此IP地址。

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

ip1 =>转换为某个整数表示i1 =>索引现在仅为i1 % 32

任何适合于转换IP地址的用例的散列技术也将是有用的。

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2015-10-12 11:53:49

您是否期望为您的问题提供任何散列算法参考?

因为您有32个数组大小。

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

您还可以仅将您的IP地址的2个字节作为散列的基础,因为单个子网中的高位字节可能是相同的。

在发生冲突的情况下,您需要使用指针数组而不是一维数组,以便可以使用相同的散列存储多个地址。

票数 0
EN

Stack Overflow用户

发布于 2015-10-12 15:42:38

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

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

看看java hashmap如何将hashcode映射到底层数组的索引可能会很有帮助:

代码语言:javascript
复制
static int  indexFor(int h, int length) {
     return h & (length-1);
 }

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33072864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档