繁体   English   中英

图片的全球唯一随机名称

[英]Globally unique random name for Images

我正在尝试编写代码,以生成将由用户从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服务进行存储。 一个通用的存储桶将用于所有用户的所有图像。 因此,要求图像名称必须唯一。

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

CFUUID的文档中:

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

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

您太复杂了。 只需使用CFUUIDCreateString获取一个UUID并使用该字符串。 添加额外的随机性层将无济于事。 实际上,通过增加名称冲突的机会,这可能会使情况变得更糟。

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

如果需要考虑匿名性,则通过诸如SHA1或MD5之类的哈希函数运行UUID将足以使其无法识别。

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

iOS 6.0中添加了新类

@interface NSUUID : NSObject <NSCopying, NSSecureCoding>

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

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

[[NSProcessInfo processInfo] globallyUniqueString]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM