C 生成唯一密钥

C 生成唯一密钥,c,C,给定一个数字,如何从该数字创建唯一密钥。当给定不同的数字时,不得重复此键。当提供相同的数字时,它应该返回它先前生成的相同密钥,我需要在我的应用程序中使用它。请问你能推荐一些算法吗 编辑:抱歉,伙计们,当你们回答问题时,我更改了Q我认为上面的Q是一个更好的提问方式,我的Q在我的B-树中我存储ipv4的ip地址(src ip和dst ip),我使用目标ip生成密钥,例如:如果我有地址172.28.6.100,我使用最后两个字节生成密钥,作为600(6*100)现在,我必须存储ipv6地址,我如何才能

给定一个数字,如何从该数字创建唯一密钥。当给定不同的数字时,不得重复此键。当提供相同的数字时,它应该返回它先前生成的相同密钥,我需要在我的应用程序中使用它。请问你能推荐一些算法吗

编辑:抱歉,伙计们,当你们回答问题时,我更改了Q我认为上面的Q是一个更好的提问方式,我的Q在我的B-树中我存储ipv4的ip地址(src ip和dst ip),我使用目标ip生成密钥,例如:如果我有地址172.28.6.100,我使用最后两个字节生成密钥,作为600(6*100)现在,我必须存储ipv6地址,我如何才能为每个地址生成一个uniqe密钥。您的算法(从最初的问题开始,您说您正在从IP地址
a.b.c.d
生成密钥
c*d
)甚至不保证您的IPv4地址的唯一性。
172.28.6.12
将具有与
172.28.12.6
9.45.3.24
10.1.72.1
相同的密钥

这是散列的必然结果,在散列中将许多项映射到一个键

我的问题是:你为什么要散列。你可以把一个IPv4地址放入四个字节,把一个Ipv6地址放入十六个字节。它们不会太大以至于你不能用整个地址作为密钥,当然

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


既然你改变了你的问题,删除了细节,我将添加这个附录。我回答的理由没有改变

如果要对数据进行散列以生成密钥,则只有两种方法可以保证密钥的唯一性:

  • 密钥使用与数据相同的位数;或
  • 以某种方式限制数据
第一种方法只能为您带来很少的好处。有时,将稀疏数据映射到连续索引以实现高效查找非常有用,但不会节省任何空间

第二个常用于您知道数据将受到限制的情况,例如(1)您的所有IP地址都以
10.1
开头,或者它们都是1000到1099之间的整数

但是,除非您选择这些限制中的一个,否则无法保证不会发生密钥冲突。

您的算法(从原始问题开始,您表示您正在从IP地址
a.b.c.d
生成密钥
c*d
)甚至不保证您的IPv4地址的唯一性。
172.28.6.12
将具有与
172.28.12.6
9.45.3.24
10.1.72.1
相同的密钥

这是散列的必然结果,在散列中将许多项映射到一个键

我的问题是:你为什么要散列。你可以把一个IPv4地址放入四个字节,把一个Ipv6地址放入十六个字节。它们不会太大以至于你不能用整个地址作为密钥,当然

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


既然你改变了你的问题,删除了细节,我将添加这个附录。我回答的理由没有改变

如果要对数据进行散列以生成密钥,则只有两种方法可以保证密钥的唯一性:

  • 密钥使用与数据相同的位数;或
  • 以某种方式限制数据
第一种方法只能为您带来很少的好处。有时,将稀疏数据映射到连续索引以实现高效查找非常有用,但不会节省任何空间

第二个常用于您知道数据将受到限制的情况,例如(1)您的所有IP地址都以
10.1
开头,或者它们都是1000到1099之间的整数


但是,除非您选择其中一个限制,否则无法保证不会发生密钥冲突。

为什么不使用哈希算法?如果数字是4字节的整数,任何合适的哈希算法都会满足您的需要,只需将其转换为ASCII字符串即可

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

编辑后


对于在BTree中使用密钥(最初我将其理解为许可证密钥,这就是我提到转换为ASCII的原因)-没有任何理由不将整个目标IP用作密钥(无论是IPv4还是IPv6,最多128位,非常合理)。否则,除非您对网络拓扑结构有一些假设或知识,否则无法确保所需的唯一性。

为什么不使用哈希算法?如果数字是4字节整数,任何合适的哈希算法都可以满足您的需要,只需将其转换为ASCII字符串即可

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

编辑后


对于在BTree中使用密钥(最初我将其理解为许可证密钥,这就是我提到转换为ASCII的原因)-没有任何理由不将整个目标IP用作密钥(无论是IPv4还是IPv6,最多128位,非常合理)。否则,除非您对网络拓扑结构有一些假设或了解,否则无法确保所需的唯一性。

除非您处理的IP地址空间受到很好的限制(即,您可以选择数字,并且它们是专用网络的一部分,例如10.x.x.x),使用最后两个八位字节并将它们相乘将对不同的IP产生冲突每当最终答案共享多个可以创建相同密钥的乘法器时,它们不会冲突的唯一方法是如果您使用的所有八位字节都是素数(
unsigned generate_key(int x) { return x; }