Код для генерации случайных строк создает одинаковую последовательность идентичных строк - PullRequest
2 голосов
/ 09 января 2010

У меня есть следующий метод, который должен создать идентификатор из 20 символов (иногда с префиксом) и вернуть идентификатор.

Кажется, он сбрасывается при запуске, и каждый раз, когда я его использую, он создает одну и ту же последовательность идентичных номеров.

+(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(), но я не знаю, что еще использовать. Я думаю, что я даже получил это предложение от переполнения стека.

Спасибо за любую помощь!

Ответы [ 5 ]

7 голосов
/ 09 января 2010

При использовании random() вы должны установить начальное значение при запуске программы, т.е. srandom(time(NULL));

2 голосов
/ 09 января 2010

Если вы хотите полностью уникальную строку, я бы использовал NSProcessInfo, чтобы сгенерировать ее для вас, вызвав:

[[NSProcessInfo processInfo] globallyUniqueString];

Если только вы не хотите, чтобы в нем были упомянутые буквы.

2 голосов
/ 09 января 2010

My думаю, означает, что вам, вероятно, нужно установить начальное значение, так как оно будет использовать значение по умолчанию, если вы этого не сделаете.

Вы должны, по крайней мере, использовать что-то на основе даты / времени, чтобы получить что-то, что меняется для каждого прогона.

1 голос
/ 10 января 2010

К вашему сведению: если вам абсолютно необходимы уникальные строки, создайте UUID вместо случайного использования, которое с минимальной вероятностью может получить идентичные значения.

1 голос
/ 09 января 2010

Я думаю, я понял это. Я изменил random() на arc4random(), и теперь он волшебным образом работает.

Вот документация по arc4random, которая, вероятно, имеет к этому какое-то отношение:

Функция arc4random () использует генератор потока ключей, используемый шифром arc4, который использует 8 * 8 8-битные S-блоки. S-блоки могут находиться в (2 1700) состояниях. Функция arc4random () возвращает псевдослучайные числа в диапазоне от 0 до (2 32) -1 и, следовательно, имеет двойной диапазон rand (3) и random (3).

Функция arc4random_stir () считывает данные из / dev / urandom и использует их для перестановки S-блоков с помощью arc4random_addrandom ().

Нет необходимости вызывать arc4random_stir () перед использованием arc4random (), поскольку arc4random () автоматически инициализируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...