是否有CRC或密码函数用于从唯一输入生成较小尺寸的唯一结果?

时间:2017-07-04 13:26:57

标签: cryptography

我有一个128位的制造商唯一编号ID,我无法更改,它的大小对我们来说太长了(2 ^ 128)。这是在一些嵌入式微控制器上。

一个想法是计算一个(运行时)CRC32或哈希来缩小结果,但我不确定unicity CRC32作为一个例子:这对于2 ^ 32来说可能是唯一的

或者我可以使用加密功能之王来保证基于唯一输入的32位输出的单一性?

感谢您的澄清,

1 个答案:

答案 0 :(得分:1)

如果您事先知道所有这些ID值,则可以使用hash table进行检查。您可以通过仅存储每个哈希值的多个位来节省空间,以便区分它们是否恰好落在同一个存储桶中。

如果没有,那么你会很难过,我很害怕。

假设这些128位ID是作为加密散列函数(例如MD5)的输出产生的,因此每个ID类似于随机均匀选择的128位。

如果将这些值减少到32位值,那么您希望实现的最佳值是一组32位数字,其中每个位为0或1且概率均匀。你可以通过计算CRC32校验和,或者简单地丢弃96位来实现这一点 - 它没有任何区别。

32位不足以避免冲突。在仅93个输入之后,碰撞概率超过百万分之一,在2,900个输入之后,碰撞概率超过千分之一。在77,000输入之后,碰撞概率达到50%。 (Source)。

因此,您唯一真正的选择是以某种方式将ID值反向设计为更小的值,或者实现一些外部手段,用顺序整数替换这些ID(例如,使用哈希表)。