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是编译时常量,您可以通过避免重复创建对象来加速您的代码。您也可以将程序缩短一行:

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对于加密应用程序来说应该已经足够好了,但如果您计划保护的数据对您或特别是对您的客户具有很高的价值,您可能需要咨询加密专家。

编辑:针对nielsbot的评论进行了编辑。

于 2012-04-20T19:21:25.843 回答
4

FWIW,我赞成 Vincent Gable 使用 UUID 的建议。如果您设置了建议的算法,则可以通过使用类似 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,因为它们已经被很好地研究和广泛使用。在尝试保证我的手动解决方案中发生冲突的可能性之前,我可能会从那里开始。

于 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 进行了一次调用。

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 回答