生成随机字符串的代码会创建相同的相同字符串序列

时间:2010-01-09 02:12:26

标签: iphone objective-c random

我有以下方法应该创建一个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那里得到了这个建议。

感谢您的帮助!

5 个答案:

答案 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而不是使用随机数,这样可能会获得相同的值。