繁体   English   中英

如何为每个地址生成唯一编号?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM