是否有任何地方可以将UUID压缩/转换/编码/加密为unsigned int?
我从sql表中读取UUID,历史很难看,我无法更改...我只有一个unsigned int来存储它。这是C ++,以防有所作为
对此有何想法?
由于 礼
答案 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中?