【问题标题】:Code to generate random strings creates same succession of identical strings生成随机字符串的代码创建相同连续的相同字符串
【发布时间】:2010-01-09 02:12:26
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

    标签: iphone objective-c random


    【解决方案1】:

    使用random()时,应在程序启动时设置种子值,即srandom(time(NULL));

    【讨论】:

    • 使用 arc4random() 代替 random() 并设置种子值有什么缺点吗?
    • @mjdth 对不起,我没有内部信息有什么实际不同。我猜arc4random() 更先进,因为它是为加密强度应用而设计的,因此可能需要更多的 CPU 周期...
    【解决方案2】:

    我的猜测是您可能需要设置种子,因为如果您不这样做,它将使用默认值。

    您至少应该使用基于日期/时间的东西来获得每次运行都不同的东西。

    【讨论】:

      【解决方案3】:

      如果您想要一个完全唯一的字符串,我会使用 NSProcessInfo 通过调用为您生成一个:

      [[NSProcessInfo processInfo] globallyUniqueString];

      除非您只希望它包含提到的那些字母。

      【讨论】:

        【解决方案4】:

        我想我已经明白了。我将random() 更改为arc4random(),它现在似乎神奇地工作了。

        这是arc4random 上可能与它有关的文档:

        arc4random() 函数使用 arc4 密码使用的密钥流生成器,它使用 8*8 8 位 S-Box。 S-Box 可以处于大约 (21700) 状态。 arc4random() 函数返回 0 到 (232)-1 范围内的伪随机数,因此具有 rand(3) 和 random(3) 范围的两倍。

        arc4random_stir() 函数从 /dev/urandom 读取数据并通过 arc4random_addrandom() 使用它来置换 S-Box。

        在使用 arc4random() 之前无需调用 arc4random_stir(),因为 arc4random() 会自动初始化。

        【讨论】:

          【解决方案5】:

          仅供参考:如果您绝对需要唯一的字符串,请创建一个 UUID 而不是使用随机的,因为随机获得相同值的机会很小。

          【讨论】:

            猜你喜欢
            • 2011-02-14
            • 2010-11-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多