Como posso gerar uma sequência alfanumérica aleatória no Swift?
208
Atualização Swift 4.2
O Swift 4.2 introduziu grandes melhorias ao lidar com valores e elementos aleatórios. Você pode ler mais sobre essas melhorias aqui . Aqui está o método reduzido para algumas linhas:
func randomString(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
return String((0..<length).map{ _ in letters.randomElement()! })
}
Atualização do 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
}
Resposta original:
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
}
Aqui está uma solução pronta para uso na sintaxe Swiftier . Você pode simplesmente copiar e colar:
Se você preferir um Framework que também tenha alguns recursos mais úteis, fique à vontade para conferir meu projeto HandySwift . Ele também inclui uma bela solução para seqüências alfanuméricas aleatórias :
fonte
Você também pode usá-lo da seguinte maneira:
Uso simples:
Sintaxe do Swift 3:
Sintaxe do Swift 4:
fonte
Rápido:
fonte
Com o Swift 4.2, sua melhor aposta é criar uma sequência com os caracteres desejados e, em seguida, usar randomElement para escolher cada caractere:
Eu detalho mais sobre essas mudanças aqui .
fonte
ATUALIZADO 2019.
No caso incomum que
questões de desempenho.
Aqui está uma função extremamente clara que armazena em cache :
Isso ocorre quando você tem um conjunto de caracteres conhecido e fixo.
Dica útil:
Observe que "abcdefghjklmnpqrstuvwxyz12345789" evita caracteres 'ruins'
Não há 0, o, O, i, etc ... os personagens que os humanos frequentemente confundem.
Isso geralmente é feito para códigos de reserva e códigos semelhantes que os clientes humanos usarão.
fonte
repeating:count:
.Simples e Rápido - UUID (). UuidString
Swift 3.0
EDITAR
Por favor, não confunda com
UIDevice.current.identifierForVendor?.uuidString
isso, não dará valores aleatórios.fonte
Versão Swift 2.2
Basicamente, chame esse método que irá gerar uma sequência aleatória do comprimento do número inteiro entregue à função. Para alterar os caracteres possíveis, edite a string charactersString. Também suporta caracteres unicode.
https://gist.github.com/gingofthesouth/54bea667b28a815b2fe33a4da986e327
fonte
EXC_BAD_INSTRUCTION
let random = randomString(16)
. O EXC estava apenas em um dispositivo real e eu não o vi em um simulador e era intermitente no dispositivo.random % count
se não (sempre) criar uma distribuição uniforme. Se isso for relevante para você, procure outras respostas usadasarc4random_uniform()
.Para pessoas que não desejam digitar todo o conjunto de caracteres:
fonte
para Swift 3.0
fonte
Um Swift puro aleatório
String
de qualquerCharacterSet
.Uso:
CharacterSet.alphanumerics.randomString(length: 100)
A
characters()
função é minha implementação mais rápida conhecida .fonte
fonte
Minha implementação ainda mais rápida da questão:
fonte
Sem loop, embora seja limitado a 43 caracteres. Se você precisar de mais, ele pode ser modificado. Essa abordagem possui duas vantagens em relação ao uso exclusivo de um UUID:
UUID()
gera apenas letras maiúsculasUUID
tem no máximo 36 caracteres (incluindo os 4 hífens), mas apenas 32 caracteres sem. Se você precisar de algo mais ou não quiser incluir hífens, o uso dasbase64EncodedString
alçasAlém disso, esta função utiliza a
UInt
para evitar números negativos.Chamando-o em um loop para verificar a saída:
Qual produz:
fonte
Swift 5.0
fonte
O problema com as respostas às perguntas "Eu preciso de seqüências aleatórias" (em qualquer idioma) é praticamente toda solução usa uma especificação primária falha no comprimento da string . As perguntas em si raramente revelam por que as strings aleatórias são necessárias, mas eu desafiaria que você raramente precise de strings aleatórias, digamos 8. O que você invariavelmente precisa é de um número de strings únicos , por exemplo, para usar como identificadores para algum propósito.
Existem duas maneiras principais de obter seqüências estritamente exclusivas : deterministicamente (o que não é aleatório) e armazenar / comparar (o que é oneroso). O que nós fazemos? Desistimos do fantasma. Em vez disso, optamos pela singularidade probabilística . Ou seja, aceitamos que haja algum risco (ainda que pequeno) de que nossas strings não sejam únicas. É aqui que entender a probabilidade de colisão e a entropia é útil.
Então, vou reformular a necessidade invariável, pois precisa de um certo número de strings com um pequeno risco de repetição. Como exemplo concreto, digamos que você queira gerar um potencial de 5 milhões de IDs. Você não deseja armazenar e comparar cada nova sequência e deseja que elas sejam aleatórias, portanto aceita alguns riscos de repetição. Como exemplo, digamos um risco de menos de 1 em um trilhão de chances de repetição. Então, qual o comprimento da corda que você precisa? Bem, essa pergunta é subespecificada, pois depende dos caracteres usados. Mais importante, porém, é equivocado. O que você precisa é de uma especificação da entropia das strings, não do seu comprimento. A entropia pode estar diretamente relacionada à probabilidade de repetição em algum número de strings. O comprimento da string não pode.
E é aqui que uma biblioteca como EntropyString pode ajudar. Para gerar IDs aleatórios com menos de 1 em um trilhão de chances de repetição em 5 milhões de strings usando
EntropyString
:EntropyString
usa um conjunto de caracteres com 32 caracteres por padrão. Existem outros conjuntos de caracteres predefinidos e você também pode especificar seus próprios caracteres. Por exemplo, gerando IDs com a mesma entropia acima, mas usando caracteres hexadecimais:Observe a diferença no comprimento da sequência devido à diferença no número total de caracteres no conjunto de caracteres usado. O risco de repetição no número especificado de sequências em potencial é o mesmo. Os comprimentos das cordas não são. E o melhor de tudo, o risco de repetição e o número potencial de strings é explícito. Não há mais adivinhação com o comprimento da corda.
fonte
Se sua seqüência aleatória deve ser segura-aleatória, use o seguinte:
fonte
Se você precisar apenas de um identificador exclusivo,
UUID().uuidString
poderá servir a seus propósitos.fonte
Atualizado para o Swift 4. Use uma variável armazenada lenta na extensão de classe. Isso só é calculado uma vez.
fonte
SWIFT 4
Usando RandomNumberGenerator para obter melhor desempenho como recomendação da Apple
Uso:
String.random(20)
Resultado:CifkNZ9wy9jBOT0KJtV4
fonte
Este é o Swift solução -est eu poderia vir acima com. Swift 3.0
fonte
fonte