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