这是在iPhone上生成随机字符串的好方法吗?

时间:2012-04-20 19:05:20

标签: objective-c ios security

这是我提出的代码:

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)另外,如果我想在某天制作大量的琴弦,有更快的方法吗?这似乎很慢,因为它每次都会通过循环创建一个对象。

5 个答案:

答案 0 :(得分: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的评论进行了编辑。

答案 1 :(得分:4)

FWIW,我赞成Vincent Gable关于使用UUID的建议。如果您使用建议的算法进行设置,则可以通过使用类似nielsbot代码的变体来获得更多的变化(只需将字符串替换为您想要包含的随机字符串的一部分)... < / p>

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 ] ;
}

答案 2 :(得分:2)

您也可以考虑使用a UUID,因为它们是pretty well studied and widely used。在尝试保证手动解决方案中碰撞的可能性之前,我可能会从那里开始。

答案 3 :(得分: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 ] ;
}

答案 4 :(得分: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];
}