Как я могу сгенерировать случайную буквенно-цифровую строку в Swift?
208
Обновление Swift 4.2
В Swift 4.2 внесены значительные улучшения в работе со случайными значениями и элементами. Вы можете прочитать больше об этих улучшениях здесь . Вот метод, сокращенный до нескольких строк:
func randomString(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
return String((0..<length).map{ _ in letters.randomElement()! })
}
Обновление Swift 3.0
func randomString(length: Int) -> String {
let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = UInt32(letters.length)
var randomString = ""
for _ in 0 ..< length {
let rand = arc4random_uniform(len)
var nextChar = letters.character(at: Int(rand))
randomString += NSString(characters: &nextChar, length: 1) as String
}
return randomString
}
Оригинальный ответ:
func randomStringWithLength (len : Int) -> NSString {
let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
var randomString : NSMutableString = NSMutableString(capacity: len)
for (var i=0; i < len; i++){
var length = UInt32 (letters.length)
var rand = arc4random_uniform(length)
randomString.appendFormat("%C", letters.characterAtIndex(Int(rand)))
}
return randomString
}
Вот готовое к использованию решение в синтаксисе Swiftier . Вы можете просто скопировать и вставить его:
Если вы предпочитаете Framework , у которого также есть несколько удобных функций, тогда смело проверяйте мой проект HandySwift . Он также включает в себя красивое решение для случайных буквенно-цифровых строк :
источник
Вы можете использовать его также следующим образом:
Простое использование:
Swift 3 Синтаксис:
Swift 4 Синтаксис:
источник
Swift:
источник
В Swift 4.2 лучше всего создать строку с нужными символами, а затем использовать randomElement для выбора каждого символа:
Подробнее об этих изменениях я расскажу здесь .
источник
ОБНОВЛЕНО 2019.
В необычном случае это
производительность имеет значение.
Вот чрезвычайно понятная функция, которая кеширует :
Это для случаев, когда у вас есть фиксированный, известный набор символов.
Полезный совет:
Обратите внимание, что «abcdefghjklmnpqrstuvwxyz12345789» избегает «плохих» символов
Здесь нет 0, o, O, i и т. Д. ... символы, которые люди часто путают.
Это часто делается для кодов бронирования и аналогичных кодов, которые будут использовать клиенты-люди.
источник
repeating:count:
.Просто и быстро - UUID (). UuidString
Swift 3.0
РЕДАКТИРОВАТЬ
Пожалуйста, не путайте с
UIDevice.current.identifierForVendor?.uuidString
этим не даст случайных значений.источник
Версия Swift 2.2
В основном, вызовите этот метод, который сгенерирует случайную строку длиной целого числа, переданного функции. Чтобы изменить возможные символы, просто отредактируйте строку charactersString. Поддерживает символы Unicode тоже.
https://gist.github.com/gingofthesouth/54bea667b28a815b2fe33a4da986e327
источник
EXC_BAD_INSTRUCTION
let random = randomString(16)
. EXC был только на реальном устройстве, и я не видел его в симуляторе, и он был прерывистым на устройстве.random % count
это не (всегда) создают однородное распределение. Если это относится к вам, посмотрите другие ответы, которые используютarc4random_uniform()
.Для людей, которые не хотят печатать весь набор символов:
источник
для Swift 3.0
источник
Чистый Свифт, случайный
String
из любогоCharacterSet
.Использование:
CharacterSet.alphanumerics.randomString(length: 100)
Эта
characters()
функция - моя самая известная реализация .источник
источник
Моя еще более быстрая реализация этого вопроса:
источник
Свободный цикл, хотя он ограничен 43 символами. Если вам нужно больше, его можно изменить. Этот подход имеет два преимущества перед использованием только UUID:
UUID()
генерирует только заглавные буквыUUID
не более 36 символов (включая 4 дефиса), но без 32 символов. Если вам нужно что-то более длинное, или не хотите, чтобы дефисы были включены, используйтеbase64EncodedString
ручкиКроме того, эта функция использует,
UInt
чтобы избежать отрицательных чисел.Вызывая это в цикле, чтобы проверить вывод:
Который производит:
источник
Swift 5.0
источник
Проблема с ответами на вопросы «Мне нужны случайные строки» (на любом языке) состоит в том, что практически каждое решение использует некорректную первичную спецификацию длины строки . Сами вопросы редко показывают, зачем нужны случайные строки, но я бы сказал, что вам редко нужны случайные строки длиной, скажем, 8. Что вам обязательно нужно, так это некоторое количество уникальных строк , например, для использования в качестве идентификаторов для каких-то целей.
Есть два основных способа получения строго уникальных строк: детерминистично (что не случайно) и хранить / сравнивать (что обременительно). Что мы делаем? Мы отдаем призрак. Вместо этого мы используем вероятностную уникальность . То есть мы признаем, что существует некоторый (хотя и небольшой) риск того, что наши строки не будут уникальными. Это где понимание вероятности столкновения и энтропии полезно .
Поэтому я перефразирую неизменную потребность как нужное количество строк с небольшим риском повторения. В качестве конкретного примера, скажем, вы хотите создать 5 миллионов идентификаторов. Вы не хотите хранить и сравнивать каждую новую строку, и вы хотите, чтобы они были случайными, поэтому вы принимаете на себя некоторый риск повторения. Например, допустим, что риск повторения меньше 1 в триллионе. Так какая длина строки вам нужна? Ну, этот вопрос недостаточно конкретизирован, поскольку зависит от используемых символов. Но что более важно, это ошибочно. Вам нужно указать энтропию строк, а не их длину. Энтропия может быть напрямую связана с вероятностью повторения в некотором количестве строк. Длина строки не может.
И здесь может помочь библиотека вроде EntropyString . Чтобы сгенерировать случайные идентификаторы с вероятностью повторения менее 1 на триллион в 5 миллионах строк, используйте
EntropyString
:EntropyString
по умолчанию использует набор из 32 символов. Существуют и другие предопределенные наборы символов, и вы также можете указать свои собственные символы. Например, генерация идентификаторов с той же энтропией, что и выше, но с использованием шестнадцатеричных символов:Обратите внимание на разницу в длине строки из-за разницы в общем количестве символов в используемом наборе символов. Риск повторения в указанном количестве потенциальных строк одинаков. Длина строки не. И, что лучше всего, риск повторения и потенциальное количество строк явно. Больше не нужно гадать с длиной строки.
источник
Если ваша случайная строка должна быть безопасной случайной, используйте это:
источник
Если вам просто нужен уникальный идентификатор,
UUID().uuidString
может служить вашим целям.источник
Обновлено для Swift 4. Используйте ленивую хранимую переменную в расширении класса. Это вычисляется только один раз.
источник
SWIFT 4
Использование RandomNumberGenerator для лучшей производительности как рекомендация Apple
Использование:
String.random(20)
Результат:CifkNZ9wy9jBOT0KJtV4
источник
Это Swift- лучшее решение, которое я мог придумать. Swift 3.0
источник
источник