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

Iphone 生成随机字符串的代码创建相同字符串的相同序列,iphone,objective-c,random,Iphone,Objective C,Random,我有以下方法可以创建一个20个字符的ID(有时带有前缀)并返回ID 它似乎在启动时重置,每次我使用它时,它都会创建相同序列的相同数字 +(NSString *)createUniqueIdentifier:(NSString *)withPrefix { NSString *outstring = nil; if (withPrefix!=nil && ![withPrefix isEqualToString:@""]) { outstring

我有以下方法可以创建一个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;

}
+(NSString*)createUniqueIdentifier:(NSString*)带前缀{
NSString*outstring=nil;
if(withPrefix!=nil&&![withPrefix IsequalString:@”“){
outstring=[withPrefix stringByAppendingString:@“-”];
}否则{
突出=@;
}
NSInteger ii;
NSString*allletters=@“ABCDEFGHIJKLMNOPQRSTUVWXYZ”;

对于(ii=0;ii我想我已经弄明白了。我将
random()
更改为
arc4random()
,现在它神奇地工作了

以下是有关
arc4random
的文档,可能与此有关:

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

arc4random_stir()函数从/dev/urandom读取数据,并使用它通过arc4random_addrandom()排列S盒

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

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


您至少应该使用基于日期/时间的内容来获取每次运行时不同的内容。

当使用
random()
时,您应该在程序开始时设置种子值,即
srandom(time(NULL));

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

[[NSProcessInfo processInfo]globallyUniqueString];


除非您只希望它包含上面提到的字母。

仅供参考:如果您绝对需要唯一的字符串,请创建一个,而不是使用random,这很有可能获得相同的值。

使用
arc4random()
而不是
random()有什么缺点吗
具有设置的种子值?@mjdth抱歉,我没有内部信息实际不同之处。我想,
arc4random()
更高级,因为它是为加密强度应用而设计的,因此可能需要更多的cpu周期。。。