Генерировать случайную буквенно-цифровую строку в Swift

Как создать случайную буквенно-цифровую строку в Swift?

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 } 

Обновление 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 } 

Вот готовое к использованию решение в синтаксисе Swiftier . Вы можете просто скопировать и вставить его:

 func randomAlphaNumericString(length: Int) -> String { let allowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" let allowedCharsCount = UInt32(allowedChars.characters.count) var randomString = "" for _ in 0.. 

Если вы предпочитаете Рамку, которая также имеет некоторые более удобные функции, то не стесняйтесь проверить мой проект HandySwift . Он также включает красивое решение для случайных буквенно-цифровых строк :

 String(randomWithLength: 8, allowedCharactersType: .alphaNumeric) // => "2TgM5sUG" 

Вы можете использовать его также следующим образом:

 extension String { static func random(length: Int = 20) -> String { let base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" var randomString: String = "" for _ in 0.. 

Простое использование:

 let randomString = String.random() 

Swift 3 Синтаксис:

 extension String { static func random(length: Int = 20) -> String { let base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" var randomString: String = "" for _ in 0.. 

Swift 4 Синтаксис:

 extension String { static func random(length: Int = 20) -> String { let base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" var randomString: String = "" for _ in 0.. 

Swift:

 let randomString = NSUUID().uuidString 

Версия Swift 2.2

 // based on https://gist.github.com/samuel-mellert/20b3c99dec168255a046 // which is based on https://gist.github.com/szhernovoy/276e69eb90a0de84dd90 // Updated to work on Swift 2.2 func randomString(length: Int) -> String { let charactersString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" let charactersArray : [Character] = Array(charactersString.characters) var string = "" for _ in 0.. 

В основном вызовите этот метод, который будет генерировать случайную строку, длину целого, переданного функции. Чтобы изменить возможные символы, просто отредактируйте строку charactersString. Поддерживает символы unicode.

https://gist.github.com/gingofthesouth/54bea667b28a815b2fe33a4da986e327

Простой и быстрыйUUID (). UuidString

// Возвращает строку, созданную из UUID, такую ​​как «E621E1F8-C36C-495A-93FC-0C247A3E6E5F»

public var uuidString: String {get}

https://developer.apple.com/documentation/foundation/uuid

Swift 3.0

 let randomString = UUID().uuidString //0548CD07-7E2B-412B-AD69-5B2364644433 print(randomString.replacingOccurrences(of: "-", with: "")) //0548CD077E2B412BAD695B2364644433 

РЕДАКТИРОВАТЬ

Не путайте с UIDevice.current.identifierForVendor?.uuidString он не даст случайных значений.

для 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 } 

С Swift 4.2 лучше всего создать строку с нужными вами символами, а затем использовать randomElement для выбора каждого символа:

 let length = 32 let characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" let randomCharacters = (0.. 

Здесь я подробно расскажу об этих изменениях.

 func randomString(length: Int) -> String { // whatever letters you want to possibly appear in the output (unicode handled properly by Swift) let letters = "abcABC012你好吗😀🐱💥∆𝚹∌⌘" let n = UInt32(letters.characters.count) var out = "" for _ in 0.. 

Мое еще более быстрое решение вопроса:

 func randomAlphanumericString(length: Int) -> String { let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".characters let lettersLength = UInt32(letters.count) let randomCharacters = (0.. String in let offset = Int(arc4random_uniform(lettersLength)) let c = letters[letters.startIndex.advancedBy(offset)] return String(c) } return randomCharacters.joinWithSeparator("") } 

Может быть, кто-то наберет кого-нибудь, если у вас есть необычный случай, который

вопросы эффективности.

Вот очень простая, ясная, автономная функция, которая кэширует,

(Я думаю, что это то, что вы просто оставите в глобальной сфере для простоты.)

 func randomNameString(length: Int = 7)->String{ enum s { static let c = Array("abcdefghjklmnpqrstuvwxyz12345789".characters) static let k = UInt32(c.count) } var result = [Character](repeating: "a", count: length) for i in 0.. 

Обратите внимание, что здесь речь идет о фиксированном известном наборе символов - он кэшируется.

Если вам нужен другой набор символов, просто создайте другую кешированную функцию,

 func randomVowelsString(length: Int = 20)->String{ enum s { static let c = Array("AEIOU".characters) ... 

Удобный наконечник:

Обратите внимание, что набор «abcdefghjklmnpqrstuvwxyz12345789» избегает «плохих» символов

Нет 0, o, O, i и т. Д. ... персонажи людей часто путают.

Это часто делается для кодов бронирования и т. Д.

Если ваша случайная строка должна быть безопасно-случайной, используйте это:

 import Foundation import Security // ... private static func createAlphaNumericRandomString(length: Int) -> String? { // create random numbers from 0 to 63 // use random numbers as index for accessing characters from the symbols string // this limit is chosen because it is close to the number of possible symbols AZ, az, 0-9 // so the error rate for invalid indices is low let randomNumberModulo: UInt8 = 64 // indices greater than the length of the symbols string are invalid // invalid indices are skipped let symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" var alphaNumericRandomString = "" let maximumIndex = symbols.count - 1 while alphaNumericRandomString.count != length { let bytesCount = 1 var randomByte: UInt8 = 0 guard errSecSuccess == SecRandomCopyBytes(kSecRandomDefault, bytesCount, &randomByte) else { return nil } let randomIndex = randomByte % randomNumberModulo // check if index exceeds symbols string length, then skip guard randomIndex <= maximumIndex else { continue } let symbolIndex = symbols.index(symbols.startIndex, offsetBy: Int(randomIndex)) alphaNumericRandomString.append(symbols[symbolIndex]) } return alphaNumericRandomString } 

Проблема с ответами на вопросы «Мне нужны случайные строки» (на любом языке) практически на каждом решении использует неверную основную спецификацию длины строки . Сами вопросы редко показывают, почему нужны случайные строки, но я бы бросил вызов вам редко нужны случайные строки длины, скажем 8. То, что вам обязательно нужно, – это некоторое количество уникальных строк , например, для использования в качестве идентификаторов для какой-либо цели.

Существует два ведущих способа получить строго уникальные строки: детерминистически (что не случайно) и хранить / сравнивать (что является обременительным). Что мы делаем? Мы бросаем призрак. Вместо этого мы идем с вероятностной уникальностью . То есть мы согласны с тем, что существует (хотя и небольшой) риск того, что наши строки не будут уникальными. Здесь полезно понимание вероятности столкновения и энтропии .

Поэтому я буду перефразировать неизменную потребность, поскольку вам нужно некоторое количество строк с небольшим риском повторения. В качестве конкретного примера предположим, что вы хотите создать потенциал в 5 миллионов идентификаторов. Вы не хотите хранить и сравнивать каждую новую строку, и вы хотите, чтобы они были случайными, поэтому вы принимаете некоторый риск повторения. Например, допустим, риск повторения может быть менее 1 в триллионе. Итак, какая длина строки вам нужна? Ну, этот вопрос указан ниже, поскольку он зависит от используемых символов. Но что более важно, это ошибочно. Вам нужна спецификация энтропии строк, а не их длина. Энтропия может быть непосредственно связана с вероятностью повторения в некотором количестве строк. Длина строки не может.

И здесь может помочь библиотека, подобная EntropyString . Чтобы генерировать случайные идентификаторы, которые имеют менее 1 триллиона вероятности повторения в 5 миллионах строк, используя EntropyString :

 import EntropyString let random = Random() let bits = Entropy.bits(for: 5.0e6, risk: 1.0e12) random.string(bits: bits) 

“Rrrj6pN4d6GBrFLH4”

EntropyString использует набор символов с 32 символами. Существуют и другие предопределенные наборы символов, и вы также можете указать свои собственные символы. Например, генерируя идентификаторы с той же энтропией, что и выше, но с использованием шестнадцатеричных символов:

 import EntropyString let random = Random(.charSet16) let bits = Entropy.bits(for: 5.0e6, risk: 1.0e12) random.string(bits: bits) 

“135fe71aec7a80c02dce5”

Обратите внимание на разницу в длине строки из-за разницы в общем количестве символов в используемом наборе символов. Риск повторения в указанном числе потенциальных строк одинаковый. Длина строк не является. И, самое главное, риск повторения и потенциального количества строк является явным. Больше не догадывается длина строки.

Если вам нужен уникальный идентификатор, UUID().uuidString может служить вашим целям.

Это быстрое решение, которое я мог бы придумать. Swift 3.0

 extension String { static func random(length: Int) -> String { let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" let randomLength = UInt32(letters.characters.count) let randomString: String = (0 ..< length).reduce(String()) { accum, _ in let randomOffset = arc4random_uniform(randomLength) let randomIndex = letters.index(letters.startIndex, offsetBy: Int(randomOffset)) return accum.appending(String(letters[randomIndex])) } return randomString } } 

Быстро:

Просто упрощен для понятного способа быстро.

 func randomString(_ length: Int) -> String { let master = Array("abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ_123456789".characters) //0...62 = 63 var randomString = "" for _ in 1...length{ let random = arc4random_uniform(UInt32(master.count)) randomString.append(String(master[Int(random)])) } return randomString } 

Обновлено для Swift 4. Используйте ленивую сохраненную переменную в расширении classа. Это вычисляется только один раз.

 extension String { static var chars: [Character] = { return "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".map({$0}) }() static func random(length: Int) -> String { var partial: [Character] = [] for _ in 0.. 

Loop free, хотя он ограничен 43 символами. Если вам нужно больше, его можно изменить. Этот подход имеет два преимущества перед использованием UUID:

  1. Большая энтропия с использованием строчных букв, поскольку UUID() генерирует только буквы верхнего регистра
  2. UUID длиной не более 36 символов (включая 4 дефиса), но без 32 символов. Если вам нужно что-то более длинное или не хотите включать дефис, использование base64EncodedString обрабатывает это

Кроме того, эта функция использует UInt чтобы избежать отрицательных чисел.

  func generateRandom(size: UInt) -> String { let prefixSize = Int(min(size, 43)) let uuidString = UUID().uuidString.replacingOccurrences(of: "-", with: "") return String(Data(uuidString.utf8) .base64EncodedString() .replacingOccurrences(of: "=", with: "") .prefix(prefixSize)) } 

Вызов его в цикле для проверки вывода:

 for _ in 0...10 { print(generateRandom(size: 32)) } 

Что производит:

 Nzk3NjgzMTdBQ0FBNDFCNzk2MDRENzZF MUI5RURDQzE1RTdCNDA3RDg2MTI4QkQx M0I3MjJBRjVFRTYyNDFCNkI5OUM1RUVC RDA1RDZGQ0IzQjI1NDdGREI3NDgxM0Mx NjcyNUQyOThCNzhCNEVFQTk1RTQ3NTIy MDkwRTQ0RjFENUFGNEFDOTgyQTUxODI0 RDU2OTNBOUJGMDE4NDhEODlCNEQ1NjZG RjM2MTUxRjM4RkY3NDU2OUFDOTI0Nzkz QzUwOTE1N0U1RDVENDE4OEE5NTM2Rjcy Nzk4QkMxNUJEMjYwNDJDQjhBQkY5QkY5 ODhFNjU0MDVEMUI2NEI5QUIyNjNCNkVF 

Чистая случайная String Swift из любого CharacterSet .

Использование: CharacterSet.alphanumerics.randomString(length: 100)

 extension CharacterSet { /// extracting characters /// https://stackoverflow.com/a/52133647/1033581 public func characters() -> [Character] { return codePoints().compactMap { UnicodeScalar($0) }.map { Character($0) } } public func codePoints() -> [Int] { var result: [Int] = [] var plane = 0 for (i, w) in bitmapRepresentation.enumerated() { let k = i % 8193 if k == 8192 { plane = Int(w) << 13 continue } let base = (plane + k) << 3 for j in 0 ..< 8 where w & 1 << j != 0 { result.append(base + j) } } return result } /// building random string of desired length /// https://stackoverflow.com/a/42895178/1033581 public func randomString(length: Int) -> String { let charArray = characters() let charArrayCount = UInt32(charArray.count) var randomString = "" for _ in 0 ..< length { randomString += String(charArray[Int(arc4random_uniform(charArrayCount))]) } return randomString } } 

Функция characters() - это моя самая быстрая реализация .

 func randomUIDString(_ wlength: Int) -> String { let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" var randomString = "" for _ in 0 ..< wlength { let length = UInt32 (letters.length) let rand = arc4random_uniform(length) randomString = randomString.appendingFormat("%C", letters.character(at: Int(rand))); } return randomString } 
  • Как написать обратную косую черту (\) в строке?
  • Преобразование в верхний и нижний регистр в Java
  • Команды командной строки запуска
  • Поиск индекса символа в строке Swift
  • Извлечь подстроку в Bash
  • Обратить строку в Java
  • Как добавить символ в std :: string?
  • Получить строковый символ по индексу - Java
  • Удалить все не «словарные символы» из String в Java, оставив акцентированные символы?
  • Более безопасная, но простая в использовании и гибкая альтернатива C ++ для s ++ ()
  • Преобразование XmlDocument в String
  • Давайте будем гением компьютера.