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

时间:2015-02-10 07:27:56

标签: java algorithm

我有几个像这样的地址 -

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

正如您在上面所看到的,289将使用我的算法来获取两个IP地址,以便对八位字节进行求和,这不是我想要的。我需要一个唯一的号码,这是每个IP地址的短数据类型。

有没有更好的方法用其他公式做到这一点?我认为我的算法将保证唯一性。

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:2)

如果您事先知道可能的IP地址集,如果该集合的大小小于短期内可以保存的数量(小于2 ^ 16),那么您可以查看实现一个完美的哈希函数,保证将每个IP地址映射到一个唯一的16位值。

  

没有冲突的哈希函数称为&#34;完美   哈希函数&#34; (PHF)。散列表没有漏洞的PHF   它(也就是说,哈希表只有搜索列表一样大)   称为&#34;最小完美哈希函数&#34; (MPHF)。

有很多工具可以生成完美哈希函数和一篇好文章here

您将不得不考虑这种方法的含义 - 如果IP地址集发生变化,那么您的PHF将不再是完美的可能性,修复此问题将涉及重新生成PHF并更改代码。如上所述,IPv4地址已经具有唯一的32位表示,如果完全可行,我会使用它。