图像的全球唯一随机名称

时间:2013-03-04 16:29:16

标签: iphone ios objective-c amazon-web-services

我正在尝试编写代码,以便为用户从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服务进行存储。并且一个公共存储桶将用于所有用户的所有图像。因此,它要求图像名称应该是唯一的。

4 个答案:

答案 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]