我正在尝试编写代码,以便为用户从iOS应用程序上传到服务器的图像生成全局唯一名称。名称应随机生成,并且应该是唯一的,以便不覆盖/替换图像。
这是我生成随机和唯一字符串的代码:
+ (NSString *)generateRandNameWithLength:(int)len
{
NSString *letters = [NSString stringWithFormat:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ%@0123456789", [HJUtilities generateUniqueApId]];
NSMutableString *randomString = [NSMutableString stringWithCapacity: len];
for (int i=0; i<len; i++) {
[randomString appendFormat: @"%C", [letters characterAtIndex: arc4random() % [letters length]]];
}
return randomString;
}
其中:
+ (NSString *)generateUniqueApId
{
NSString *appId = (__bridge NSString *) CFUUIDCreateString (NULL, CFUUIDCreate(NULL));
return appId;
}
返回UUID。
现在我不确定这是否是生成全局唯一字符串的正确代码。我不知道如何验证这一点,以确保没有用户会覆盖其他用户的图像。
注意:我正在使用Amazon Web服务进行存储。并且一个公共存储桶将用于所有用户的所有图像。因此,它要求图像名称应该是唯一的。
答案 0 :(得分:3)
您不需要代码。您所需要的只是CFUUIDCreateString
功能。这在所有设备上的所有用户中都是唯一的。
来自CFUUID
的文档:
UUID(通用唯一标识符),也称为GUID(全局唯一标识符)或IID(接口标识符),是128位值,保证是唯一的。通过组合生成它的计算机的唯一值(通常是以太网硬件地址)和表示自1582年10月15日00:00以来100纳秒间隔数的值,UUID在空间和时间上都是唯一的。 :00
您现在拥有的代码绝对不能保证是唯一的。
答案 1 :(得分:1)
你过度复杂了。只需使用CFUUIDCreateString
获取UUID并使用该字符串。添加额外的随机层并没有帮助。事实上,它可能会通过增加名称冲突的可能性而使事情变得更糟。
直接使用UUID的唯一理由是可以识别上载源,因为UUID是(或可以)使用设备的MAC地址生成的,该MAC地址特定于硬件。您将无法识别只有UUID的用户,但您可以说“此UUID集合来自同一设备”或“此UUID来自此设备”。 (有关各种UUID格式,请参阅RFC 4122,并在4.5节中讨论此问题。)
如果担心匿名,通过哈希函数(如SHA1或MD5)运行UUID就足以使其无法识别。
使用循环,你可以通过混合随机数来“添加随机性”,就像摇骰子几秒钟而不是一小时:唯一的区别就是你在骰子上擦汗。
答案 2 :(得分:1)
iOS 6.0中添加了一个新类
@interface NSUUID : NSObject <NSCopying, NSSecureCoding>
为了简化内存管理,您肯定可以使用它
答案 3 :(得分:0)
就本地唯一字符串而言 - 您可以将其用作文件名的一部分 - 这很方便:
[[NSProcessInfo processInfo] globallyUniqueString]