1

我正在尝试编写代码来为用户从 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

4 回答 4

3

不需要您拥有的代码。您所需要的只是CFUUIDCreateString功能。这在所有设备上的所有用户中都是唯一的。

从文档中CFUUID

UUID(通用唯一标识符),也称为 GUID(全局唯一标识符)或 IID(接口标识符),是保证唯一的 128 位值。UUID 在空间和时间上都是唯一的,方法是结合生成它的计算机的唯一值(通常是以太网硬件地址)和表示自 1582 年 10 月 15 日 00:00 以来 100 纳秒间隔数的值:00。

您现在拥有的代码绝对不能保证是唯一的。

于 2013-03-04T16:33:40.420 回答
1

你把它复杂化了。CFUUIDCreateString只需使用并使用该字符串获取 UUID 。添加额外的随机层不会有帮助。事实上,通过增加名称冲突的机会,这可能会使事情变得更糟。

反对直接使用 UUID 的唯一论点是,它可以识别上传的来源,因为 UUID 是(或可以)使用设备的 MAC 地址生成的,该地址特定于硬件。您将无法识别只有 UUID 的用户,但您可以说“此 UUID 集合来自同一设备”或“此 UUID 来自此设备”。(请参阅RFC 4122了解各种 UUID 格式以及第 4.5 节中对此问题的讨论。)

如果匿名是一个问题,通过散列函数(如 SHA1 或 MD5)运行 UUID 足以使其无法识别。

使用通过混合随机数来“添加随机性”的循环就像摇骰子几秒钟而不是一小时:唯一的区别是你在骰子上擦汗。

于 2013-03-04T16:34:42.273 回答
1

iOS 6.0 新增了一个类

@interface NSUUID : NSObject <NSCopying, NSSecureCoding>

为了简化内存管理,您肯定可以使用它

于 2013-03-04T16:37:20.527 回答
0

至于本地唯一的字符串——您可以将其用作文件名的一部分——这很方便:

[[NSProcessInfo processInfo] globallyUniqueString]
于 2013-11-19T00:21:04.050 回答