UUID转换为unsigned int

时间:2011-10-19 21:56:28

标签: c++ compression uuid

是否有任何地方可以将UUID压缩/转换/编码/加密为unsigned int?

我从sql表中读取UUID,历史很难看,我无法更改...我只有一个unsigned int来存储它。这是C ++,以防有所作为

对此有何想法?

由于 礼

3 个答案:

答案 0 :(得分:7)

正如其他人所说,丢失将128位UUID转换为更窄整数类型的信息。

如果你想保证唯一性 - 那么,这就是UUID的用途,毕竟你可能只考虑以UUID格式保存信息。

如果你能解决碰撞的可能性很小(两个不同的UUID映射到同一个整数),你可以尝试几种方法。

尽可能使用大整数类型。如果您的编译器支持无符号的64位整数类型(unsigned long long或Microsoft调用它),请使用它。

xor UUID的上下64位应该给你一个相当不错的哈希值。

如果UUID值中存在某种不合适的顺序(非随机性,可预测性),则可以计算md5或sha-1哈希值并丢弃除64位之外的所有值。你放弃哪些比特并不重要。

如果您被限制为32位整数,则可以{UIDID的四个32位四分之一xor,或者丢弃md5或sha-1散列中除32位以外的所有内容。

请注意,对于32位整数,您可能会在前两个样本上发生碰撞,但这不太可能。碰撞的可能性上升到大约50%,在可能性总数的平方根附近有一些样本,所以如果你有100,000个随机的32位数,那么它们中的两个可能是相同的。请参阅Birthday Paradox

答案 1 :(得分:1)

使用UUID的CRC32(我假设你的意思是32位整数)。显然存在碰撞的可能性,但是如果发生碰撞,那么你可以手动修复它是非常罕见的。

请注意,如果这是MS SQL Server,您可以使用CHECKSUM函数在服务器上执行crc32哈希来更新表。

答案 2 :(得分:0)

也许您可以使用哈希函数将UUID转换为始终为正数并将数字存储到unsigned int中?