如何将UUID存储为整数

8

我在这里遇到了一些问题。我正在使用以下代码在我的应用程序中生成UUID。

- (NSString *)GetUUID {
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return [(NSString *)string autorelease];
}

这段代码将返回一个NSString对象。现在我想将生成的UUID存储为unsigned int。你有关于如何在这里实现它的建议吗?


1
你不能将UUID存储为unsigned int。前者宽度为128位,而后者在iPhone上只有32位。它根本无法适应。如果您分享更多关于为什么要这样做的信息,我们可能能够提供帮助。 - Michael Petrotta
1
我想将UUID以数字形式存储,类似于一个整数而不是一个字符串。 因为在字符串形式下搜索和比较需要太多时间。这是否可能? - Hadi
不,这是不可能的。GUID已经是数字了 - 不要将其转换为字符串。 - Michael Petrotta
1
啊哈,好的。那么我能把GUID存储在任何类型中吗,还是必须直接使用它? - Hadi
3个回答

9
根据维基百科页面,UUID长度为128位。您能够处理的最大int值为64位。因此,我认为您无法将其存储在int中,因为没有足够的空间。

我认为可以这样做。您可以创建一个包含UUID部分的结构体,然后编写比较函数来处理它们。不过,这取决于您要做什么。您的帖子标记为iPhone,但您正在谈论服务器。您是如何进行比较的? - LandonSchropp
我曾在iPhone上使用NSString生成UUID并将其保存在数据库中,然后上传到服务器。如果我需要检索数据,则从手机发出相关的UUID。这需要一些时间,所以我选择了int类型,但我仍然觉得应该使用NSString。 - Hadi
我建议在iPhone应用程序中使用CFUUID来表示UUID,然后在数据库中找到一种好的方式将UUID存储为16个字节。 - LandonSchropp
好的,已经搞定了... 现在我已经创建了UUID,如果我使用GetUUID,我会得到它的一部分吗? - Hadi
好的,看一下CFUUID的文档:http://developer.apple.com/library/ios/#documentation/CoreFoundation/Reference/CFUUIDRef/Reference/reference.html。在这里,你可以看到可以使用`CFUUIDCreate`创建UUID。你也可以使用一个字节数组来创建UUID,使用`CFUUIDCreateWithBytes 方法。如果你正在从服务器检索UUID并需要在iPhone上使用CFUUID`表示,那么这将非常有用。 - LandonSchropp
显示剩余2条评论

6

使用.UUIDString将UUID转换为字符串。

获取字符串的.hash属性。

将其转换为整数。

int numericFormUUID = (int)UUIDString.hash;


注意:可能会发生碰撞,因为哈希值是有可能相同的。两个用户可能会得到相同的值,而UUID则保证唯一性。


另一种简洁的方法是对UID进行SHA256哈希,以获得十六进制字符串,然后将其转换为十进制。您可以根据需要截断以适应字节要求。 - Albert Renshaw
@MichaelCole 你能详细说明一下吗? - Albert Renshaw
@MichaelCole > 不要发帖之前就谷歌或者理解你的代码。好的,自大先生。我对UUID进行了哈希处理,以便它在OP所要求的范围内(128位-> 64位) 。我还添加了一个脚注,指出哈希是有损的,因此可能会发生冲突。我到底哪里理解错了? - Albert Renshaw

-1
有一个新的 .hashValue 属性。
UUID().hashValue

你打算如何从哈希值中重新创建原始的UUID呢? - HangarRash

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