2011-06-21 178 views
0

给定一个数字,如何从该数字创建唯一密钥。当给定不同的数字时,该键不应该重复。当提供相同的号码时,它应该返回与之前生成的相同的密钥,我在我的应用程序中需要这个密钥。请问你可以推荐任何算法生成唯一密钥

编辑:对不起,我改变了Q当你们回答Q我认为上面的Q是一个更好的方式问,我的Q是在我的B-树我存储IP地址(src ip和dst ip)的ipv4我正在生成使用目标ip的密钥,例如:如果我有一个地址172.28.6.100我生成一个密钥使用最后两个字节为600(6 * 100)现在我必须存储甚至ipv6地址如何生成一个密钥,我需要为每个地址生成一个uniqe密钥。

+1

我们知道你需要它,否则你就不会问。 –

+1

你需要什么样的钥匙?如果它是一个数字,你可以返回相同的数字! –

+2

当人们写答案时,你是否完全改变了问题? – littleadv

回答

1

你的算法(从原来的问题,在这里你说你是从生成的IP地址a.b.c.d关键c*d)甚至不保证唯一性你的IPv4地址172.28.6.12将具有与172.28.12.69.45.3.2410.1.72.1(等等)相同的密钥。

这是散列的必然结果,您可以将多个项目映射到一个键。

我的问题是:为什么是你哈希。您可以将IPv4地址分为四个字节,并将Ipv6分成十六个字节。它们不是很大,当然不能把整个地址当作钥匙吗?

而且,即使它们太大,如果您的要求在整个允许的IP地址范围内都是唯一的,那么您可能必须这样做。 保证唯一性的唯一方法是以某种方式限制输入值。


由于您已更改您的问题以删除具体内容,因此我将添加此附录。我的答案背后的原因没有改变。

如果你哈希数据生成密钥,只有两种方法来保证密钥的唯一性:

  • 使用相同的位数为你的数据做的关键;或
  • 以某种方式限制数据。

第一个购买你很少。将稀疏数据映射到连续索引以进行高效查找有时很有用,但不会为您节省任何空间。

二是经常使用,你知道的数据,如限制(1)你的所有IP地址开始10.1或他们是1000和1099。

之间的所有整数不过,除非你选择一个这些限制中,没有办法保证不会有关键的冲突。

+1

OP在他的问题中提到了IP?我很困惑... – littleadv

+1

@littleadv:原来的问题。 – paxdiablo

0

为什么不使用散列算法?鉴于这个数字是一个4字节的整数,任何像样的散列算法都会给你你所需要的,只要把它转换成一个ASCII字符串。

您可以找到标准哈希算法列表here

您的编辑

对于您的B树使用键后(原来我读的许可证密钥,这就是为什么我提到翻译成ASCII) - 有没有任何理由不使用目标IP的全部作为一个关键(无论是IPv4还是IPv6,最多的是128位,非常合理)。否则,除非您对网络地形有一些假设或知识,否则无法确保您所需的唯一性。

1

除非你正在处理的IP地址空间被很好的约束(即你来挑号码,他们是一个专用网络,如10.xxx的一部分),使用最后的两个字节,并将它们相乘在一起会针对不同IP的碰撞,只要最后的答案股份超过一个乘数,它可以创建相同的密钥,他们也不会发生冲突的唯一途径是,如果你使用的八位字节都是素数(这是他们不能)。

而不是创建一个带有键 - 值对的b-tree,我建议你使用IP地址本身作为密钥,不过,我不确定你会从这样做中获得什么。

3
unsigned generate_key(int x) { return x; } 

总是为不同的输入返回不同的散列。这是一个理想的完善哈希函数