我有几个像这样的地址 -
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地址的短数据类型。
有没有更好的方法用其他公式做到这一点?我认为我的算法将保证唯一性。
答案 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位表示,如果完全可行,我会使用它。