给定一个数字,如何从该数字创建唯一键。如果给出不同的数字,则不应重复此密钥。当提供相同的数字时,它应该返回它之前生成的相同密钥,我需要在我的应用程序中使用它。你能建议任何算法
编辑:对不起伙计们,当你们回答Q时,我改变了Q我认为上面的Q是一个更好的询问方式,我的Q在我的B树中,我正在存储ipaddress(src ip和dst ip) ipv4我正在使用目标IP生成密钥,例如:如果我有一个地址172.28.6.100我使用最后两个字节生成一个密钥为600(6 * 100)现在我必须存储甚至ipv6地址如何生成一个密钥,我需要为每个地址生成一个uniqe密钥。
答案 0 :(得分:3)
unsigned generate_key(int x) { return x; }
始终为不同的输入返回不同的哈希值。这是理想的完美哈希函数。
答案 1 :(得分:1)
您的算法(来自原始问题,您声明从IP地址c*d
生成密钥a.b.c.d
),甚至不保证 IPv4 的唯一性地址。 172.28.6.12
与[{1}}和172.28.12.6
以及9.45.3.24
(以及其他)的密钥相同。
这是散列的必然结果,您可以将多个项目映射到一个键。
我的问题是:为什么你正在哈希。您可以将IPv4地址分为四个字节,将Ipv6分配为十六个字节。它们不是那么大,以至于你无法使用整个地址作为关键,当然?
而且,即使他们 太大,如果您的要求在整个允许的IP地址范围内都是唯一的,那么您可能还是必须这样做。 保证唯一性的唯一方法是以某种方式限制输入值。
由于您已将问题更改为删除详细信息,因此我将添加此附录。我的答案背后的原因并没有改变。
如果要散列数据以生成密钥,则只有两种方法可以保证密钥的唯一性:
第一个人很少买你。将稀疏数据映射到连续索引以进行有效查找有时很有用,但不会为您节省任何空间。
第二种情况经常用于您知道数据受限的地方,例如(1)您的所有IP地址都以10.1.72.1
开头,或者它们都是1000到1099之间的整数。
但是,除非您选择其中一个限制,否则无法保证不会发生密钥冲突。
答案 2 :(得分:1)
除非您正在处理的IP地址空间受到很好的约束(即您可以选择数字并且它们是私有网络的一部分,例如10.xxx),使用最后两个八位字节并将它们相乘将具有当最终答案共享多个可以创建相同密钥的多路复用器时,不同IP的冲突,它们不会发生碰撞的唯一方法是,如果您使用的所有八位字节都是素数(它们不能是素数)。
我没有使用key->值对创建b树,而是建议你自己使用IP地址作为密钥,但是,我不确定你会从中获得什么。
答案 3 :(得分:0)
为什么不使用哈希算法?鉴于该数字是一个4字节的整数,任何合适的散列算法都可以满足您的需求,只需将ASCII转换为字符串即可。
您可以找到标准哈希算法列表here。
编辑后
为了在你的BTree中使用密钥(最初我把它看作许可证密钥,这就是我提到的转换为ASCII的原因) - 没有任何理由不将目标IP作为密钥使用(无论是IPv4还是IPv6,最多是128位,非常合理)。否则,除非您对网络拓扑结构有一些假设或知识,否则无法确保您需要的唯一性。