[英]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.