[英]How to generate unique number for each address?
我有几个这样的地址-
19.22.145.103
20.52.175.104
19.92.192.102
11.20.175.108
我想为上述每个IP地址创建一个唯一的号码。 我就是这样-
每个八位位组的总和19 + 22 + 145 + 103 = 289作为唯一数字。
但是由于我们只是对八位字节求和,因此对于某些IP地址,我们可能具有相同的数字。
19.22.145.103 = 289
20.52.175.104 = 351
19.22.147.101 = 289
11.20.175.108 = 314
如您在上面所看到的,两个IP地址将使用289
来计算我的八位字节,这不是我想要的。 我需要一个唯一的数字,该数字是每个IP地址的简短数据类型。
还有其他更好的方法可以做到这一点吗? 我以为我的算法可以保证唯一性。
IPv4地址只是一个32位数字。 aaa.bbb.ccc.ddd
只是人类可读的格式。
如果只有八位位组,则可以将其转换回唯一的32位数字,如下所示:
octet1 << 24 | octet2 << 16 | octet3 << 8 | octet4
每个八位位组为8位( 00
- FF
)。 通过将它们并排可以获得唯一的32位整数。 最简单的方法是将它们移动到位,或将它们一起移动:
octet4 --------------------------.
octet3 -------------------. |
octet2 ----------. | |
octet1 ---. | | |
| | | |
byte 1 byte 2 byte 3 byte 4
如果您事先知道可能的IP地址集合, 并且该集合的大小小于短时间内可以容纳的大小(小于2 ^ 16),那么您可以考虑实施一个可映射的Perfect Hash函数。您的每个IP地址都具有唯一的16位值。
没有冲突的哈希函数称为“完美哈希函数”(PHF)。 哈希表中没有孔(即,哈希表仅与搜索列表一样大)的PHF被称为“最小完美哈希函数”(MPHF)。
有多种工具可用于生成完善的哈希函数,并且此处提供了不错的文章。
您将不得不考虑这种方法的含义-如果IP地址集发生更改,则您的PHF可能不再是完美的,而解决此问题将涉及重新生成PHF并更改代码。 如上所述,IPv4地址已经具有唯一的32位表示形式,如果可能的话,我会使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.