7

これが私が思いついたコードです:

NSString *randomString = @"";
for (int x=0;x<NUMBER_OF_CHARS;x++) {
  randomString = [randomString stringByAppendingFormat:@"%c", (char)(65 + (arc4random() % 25))];
}
return randomString;

編集:

コメントに答えるには:

1) 私は主にコードの簡潔さに関心があります。

2) NUMBER_OF_CHARS が高い数値 (たとえば 40) の場合、これが文字列の推測に対して安全であるか、および/または衝突に対する証拠であるかどうかも疑問に思います-このアプリケーションではなく、他の場合です。

3) また、いつか大量の文字列を作りたい場合、より速い方法はありますか? ループを通過するたびにオブジェクトを作成するため、これは遅くなるようです。

4

5 に答える 5

9

がコンパイル時に一定である場合NUMBER_OF_CHARS、オブジェクトの作成を繰り返さないようにすることで、コードを高速化できます。プログラムを 1 行短くすることもできます。

char data[NUMBER_OF_CHARS];
for (int x=0;x<NUMBER_OF_CHARS;data[x++] = (char)('A' + (arc4random_uniform(26))));
return [[NSString alloc] initWithBytes:data length:NUMBER_OF_CHARS encoding:NSUTF8StringEncoding];

私の知る限り、arc4random_uniform暗号化アプリケーションには十分ですが、保護しようとしているデータがあなた、または特にクライアントにとって価値が高い場合は、暗号化の専門家に相談する必要があるかもしれません.

EDIT : nielsbotのコメントに応じて編集されました。

于 2012-04-20T19:21:25.843 に答える
4

FWIW、UUIDを使用するというVincent Gableの提案を支持します。提案されたアルゴリズムに設定されている場合は、nielsbot のコードのこのバリアントのようなものを使用して、もう少し分散を得ることができます (文字列を、ランダムな文字列の一部として含めたいものに置き換えるだけです)...

const NSUInteger NUMBER_OF_CHARS = 40 ;
NSString * CreateRandomString()
{
    static char const possibleChars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    unichar characters[NUMBER_OF_CHARS];
    for( int index=0; index < NUMBER_OF_CHARS; ++index )
    {
        characters[ index ] = possibleChars[arc4random_uniform(sizeof(possibleChars)-1)];
    }

    return [ NSString stringWithCharacters:characters length:NUMBER_OF_CHARS ] ;
}
于 2012-04-20T22:58:48.683 に答える
2

UUID はよく研究されており、広く使用されているため、UUIDの使用を検討することもできます。手巻きのソリューションで衝突の可能性を保証しようとする前に、おそらくそこから始めます。

于 2012-04-20T21:35:08.083 に答える
0

これを頻繁に行う場合は、これをすばやく行う方法を次に示します。

const NSUInteger NUMBER_OF_CHARS = 40 ;

NSString * CreateRandomString()
{
    unichar characters[NUMBER_OF_CHARS];
    for( int index=0; index < NUMBER_OF_CHARS; ++index )
    {
        characters[ index ] = 'A' + arc4random_uniform(26) ;
    }

    return [ NSString stringWithCharacters:characters length:NUMBER_OF_CHARS ] ;
}
于 2012-04-20T19:53:44.383 に答える
0

既存の回答の別の変形。これを投稿しているのは、ARC4 API を 1 回呼び出すだけでパフォーマンスが向上するように思われるからです。

NSString *random32CharacterString() {
    static const int N = 32; // must be even

    uint8_t buf[N/2];
    char sbuf[N];
    arc4random_buf(buf, N/2);
    for (int i = 0; i < N/2; i += 1) {
        sprintf (sbuf + (i*2), "%02X", buf[i]);
    }    
    return [[NSString alloc] initWithBytes:sbuf length:N encoding:NSASCIIStringEncoding];
}
于 2012-09-11T09:03:44.787 に答える