我有以下方法应该创建一个20个字符的ID(有时带有前缀)并返回ID。
似乎在发布时重置,每次我使用它都会创建相同数量的相同序列。
+(NSString *)createUniqueIdentifier:(NSString *)withPrefix {
NSString *outstring = nil;
if (withPrefix!=nil && ![withPrefix isEqualToString:@""]) {
outstring = [withPrefix stringByAppendingString:@"-"];
} else {
outstring = @"";
}
NSInteger ii;
NSString *allletters = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (ii=0; ii<20; ii++) {
outstring = [outstring stringByAppendingString:[allletters substringWithRange:[allletters rangeOfComposedCharacterSequenceAtIndex:random()%[allletters length]]]];
}
return outstring;
}
我认为这与random()
有关,但我不知道还有什么可以使用。我想我甚至从Stack Overflow那里得到了这个建议。
感谢您的帮助!
答案 0 :(得分:7)
使用random()
时,您应该在程序开始时设置种子值,即srandom(time(NULL));
答案 1 :(得分:2)
我的猜测是您可能需要设置种子,因为如果不这样做,它将使用默认种子。
你应该至少使用基于日期/时间的东西来获得每次运行时不同的东西。
答案 2 :(得分:2)
如果您想要一个完全唯一的字符串,我会使用NSProcessInfo为您生成一个字符串:
[[NSProcessInfo processInfo] globallyUniqueString];
除非你只想要它包含所提到的那些字母。
答案 3 :(得分:1)
我想我已经明白了。我将random()
更改为arc4random()
,现在神奇地似乎正在运作。
以下是关于arc4random
的文档,可能与它有关:
arc4random()函数使用arc4密码使用的密钥流生成器,它使用8 * 8 8位S-Box。 S-Box可以处于大约(2 1700)个状态。 arc4random()函数返回0到(2 32)-1范围内的伪随机数,因此具有rand(3)和random(3)范围的两倍。
arc4random_stir()函数从/ dev / urandom读取数据并使用它通过arc4random_addrandom()来置换S-Box。
在使用arc4random()之前无需调用arc4random_stir(),因为arc4random()会自动初始化自己。
答案 4 :(得分:1)
仅供参考:如果您绝对需要唯一的字符串,请创建一个UUID而不是使用随机数,这样可能会获得相同的值。