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を返します。

これがグローバルに一意の文字列を生成するための正しいコードであるかどうかはわかりません。これを確認して、他のユーザーの画像を上書きしないユーザーがいないことを確認する方法がわかりません。

注:ストレージにアマゾンウェブサービスを使用しています。また、すべてのユーザーのすべての画像に1つの共通バケットが使用されます。したがって、画像名は一意である必要があります。

4

4 に答える 4

3

お持ちのコードは必要ありません。必要なのはCFUUIDCreateString関数だけです。これは、すべてのデバイスのすべてのユーザーで一意になります。

のドキュメントからCFUUID

GUID (Globally Unique Identifier) または IID (Interface Identifier) とも呼ばれる UUID (Universally Unique Identifier) は、一意であることが保証されている 128 ビットの値です。UUID は、それが生成されたコンピューターに固有の値 (通常はイーサネット ハードウェア アドレス) と、1582 年 10 月 15 日 00:00 以降の 100 ナノ秒間隔の数を表す値を組み合わせることにより、空間と時間の両方で一意になります。 :00.

あなたが今持っているコードは絶対に一意であるとは限りません.

于 2013-03-04T16:33:40.420 に答える
1

あなたはそれを複雑にしすぎています。を使用してUUIDを取得し、CFUUIDCreateStringその文字列を使用するだけです。ランダム性のレイヤーを追加しても効果はありません。実際、名前が衝突する可能性が高くなることで、事態はさらに悪化するでしょう。

UUIDを直接使用することに対する唯一の議論は、UUIDはハードウェアに固有のデバイスのMACアドレスを使用して生成される(または生成される可能性がある)ため、アップロードのソースを識別できる可能性があるということです。UUID以外のユーザーを特定することはできませんが、「このUUIDのコレクションは同じデバイスからのものです」または「このUUIDはこのデバイスからのものです」と言うことはできます。(さまざまなUUID形式およびセクション4.5のこの問題の説明については、RFC 4122を参照してください。)

匿名性が懸念される場合は、SHA1やMD5などのハッシュ関数を介してUUIDを実行することで、UUIDを識別できないようにすることができます。

乱数を混ぜて「ランダム性を追加」するループを使用することは、1時間ではなく数秒間サイコロを振るようなものです。唯一の違いは、サイコロに汗をこすりつけることです。

于 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 に答える