簡體   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