将UUID转换为无符号整数

4

有没有地方可以将UUID压缩/转换/编码/加密为无符号整数?

我从SQL表中读取UUID,历史记录很丑陋,我无法更改... 我只有一个无符号整数来存储它。这是C++,如果有区别,请告诉我。

对此有什么想法吗?

谢谢 Reza


3
UUID是16个字节;在主流编译器中我所知道的最大整数类型是8个字节。你如何期望在不丢失数据的情况下完成这个任务? - ildjarn
1
什么类型的UUID?这是唯一重要的事情。如果它包含超过32位的信息,你将无法将其放入“unsigned int”中。 - Jon
我理解上述提到的限制。也许我可以采用其他方式来解决问题,以确保唯一性,而不是使用UUID。 - reza
@reza:最终,如果不想有数据丢失,就没有办法做到你想要的。必须决定可以接受多大程度的数据丢失。 - ildjarn
字符串 CRC 已足够独特... - reza
我同意CRC128可能足够了,但标准的CRC32不够用... ;-] - ildjarn
3个回答

8
正如其他人所说,将128位UUID转换为较窄的整数类型会丢失信息。
如果您想保证唯一性-毕竟,这就是UUID的作用,您可能只需考虑以UUID格式保留信息。
如果您可以接受低碰撞概率(两个不同的UUID映射到相同的整数),则有几件事情可以尝试。
尽可能使用大的整数类型。 如果编译器支持无符号64位整数类型(unsigned long long或Microsoft称之为什么),请使用该类型。
对UUID的上下64位进行异或操作应该可以给出一个相当不错的哈希值。
如果UUID值中存在某种顺序(非随机性,可预测性)使其不适合,则可以计算md5或sha-1哈希并丢弃所有但64位。 丢弃哪些位并不重要。
如果您被限制为32位整数,则可以将UUID的四个32位部分进行异或操作,或者丢弃md5或sha-1哈希的所有但32位。
请注意,在32位整数的情况下,你可能会在前两个样本中遇到碰撞,但这种情况不太可能发生。当样本数量接近总可能性的平方根时,碰撞的可能性增加到大约50%,因此如果你有100,000个随机的32位数字,很可能其中两个是相同的。请参见生日悖论

2

使用UUID的CRC32值(我假设您指的是32位整数)。显然存在碰撞的可能性,但如果出现碰撞,它应该很少见,您可以手动修复它。

请注意,如果这是MS SQL Server,则可以使用CHECKSUM函数对服务器进行crc32哈希以更新表格。


您可以事后进行查询,以查看是否存在任何冲突。 select count(crc_value),uuid_value group by uuid_value having count(crc_value)>1 - Mark Ransom

0
也许您可以使用哈希函数将UUID转换为始终为正数的数字,并将该数字存储到无符号整数中?

MD5是128位的,你有什么建议吗? - reza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接