Я хочу вызвать метод, передать ему длину и сгенерировать случайную буквенно-цифровую строку.
Существуют ли какие-либо служебные библиотеки, которые могут иметь несколько таких функций?
objective-c
cocoa
string
random
alphanumeric
подопечный
источник
источник
NSString
для,letters
когда простойchar
массив будет работать просто отлично. На самом деле, использование[letters characterAtIndex:(rand() % [letters length])]
кажется мне менее лаконичным, чем простоletters[rand() % strlen(letters)]
. Базовые классы действительно полезны, но для самых простых вещей они могут помочь запутать наш код, а не улучшить его.%C
вместо%c
, потому чтоcharacterAtIndex:
возвращаетunichar
arc4random_uniform((int)[letters length])
Не совсем то, что вы просите, но все же полезно:
Пример вывода:
источник
источник
alphabet
каждый раз запрашивать длину ? Он постоянен и не зависит от цикла.NSArray
кэширует егоlength
, не должно быть узким местом производительности.Конечно, вы можете сделать это короче:
источник
Если вы хотите ограничиться только шестнадцатеричными символами, тогда самый простой вариант - сгенерировать UUID:
Пример вывода:
16E3DF0B-87B3-4162-A1A1-E03DB2F59654
.Если вы хотите меньшую случайную строку, вы можете получить только первые 8 символов.
Это версия 4 UUID , который означает , что первый символ в 3 - й и 4 - й группы , не является случайным (они всегда будут
4
и один из8
,9
,A
илиB
).Каждый другой символ в строке является полностью случайным, и вы можете генерировать миллионы UUID каждую секунду в течение сотен лет без большого риска того, что один и тот же UUID будет сгенерирован дважды.
источник
NSString *uuid = [UUID UUID]
Категориальная версия ответа Джеффа Б.
NSString + Random.h
NSString + Random.m
источник
Вы также можете просто сгенерировать UUID. Хотя они не совсем случайны, они сложны и уникальны, что делает их случайными для большинства применений. Сгенерируйте один как строку и затем возьмите диапазон символов, равный переданной длине.
источник
стриж
источник
64
на компьютерныйupperBound
. Я вычисляюupperBound
за пределами блока, потому что думаю, что это работает лучше.Вот другой способ справиться с этим. Вместо использования подготовленной строки символов вы можете приводить между целыми числами и символами и генерировать динамический список символов для выбора. Он довольно скудный и быстрый, но имеет немного больше кода.
Когда я выполняю генерацию случайных символов, я предпочитаю работать непосредственно с целыми числами и приводить их вместо того, чтобы выписывать список символов, из которых я хочу извлечь. Объявление переменных в верхней части делает их более независимыми от системы, но этот код предполагает, что числа будут иметь более низкое значение, чем буквы, и что заглавные буквы будут иметь более низкое значение, чем строчные.
источник
Альтернативное решение в Swift
источник
В дополнение к хорошему ответу Мелвина, вот функция, которую я сделал ( в SWIFT! ) Для получения случайной строки:
Вот результат теста от звонка
randomStringOfLength(10)
: uXa0igA8wmисточник
Создает строчную буквенно-цифровую случайную строку заданной длины:
источник
Модификация нескольких идей здесь и в готовом Swift 4.0
Использование:
источник
Если вам нужна случайная строка в юникоде, вы можете создать случайные байты, а затем использовать действительные.
Преобразование из NSString в NSData и обратно необходимо для получения правильной строки UTF-8. Помните, что длина не обязательно будет длиной строки NSS, созданной в конце.
источник
Я сделал это, используя простой
char[]
вместоNSString *
алфавита. Я добавил это в категорию NSString.источник
источник
Метод для вызова:
Метод:
Полученные результаты:
источник
для Swift 3.0
источник
источник
Модификация для ответа keithyip:
источник