Quero chamar um método, passar o comprimento e gerar uma string alfanumérica aleatória.
Existem bibliotecas de utilidade por aí que podem ter um monte desses tipos de funções?
objective-c
cocoa
string
random
alphanumeric
enfermaria
fonte
fonte
NSString
paraletters
quando umachar
matriz simples funcionaria bem. De fato, o uso[letters characterAtIndex:(rand() % [letters length])]
me parece menos conciso do que justoletters[rand() % strlen(letters)]
. As classes da Foundation são realmente úteis, mas, para as coisas mais simples, elas podem servir para confundir nosso código em vez de aprimorá-lo.%C
vez de%c
, porquecharacterAtIndex:
retorna aunichar
arc4random_uniform((int)[letters length])
Não é exatamente o que você pede, mas ainda é útil:
Saída de amostra:
fonte
fonte
alphabet
cada vez? É constante e não depende do loop.NSArray
armazena em cache o seulength
, não deve ser um gargalo de desempenho.Certamente você pode fazer isso mais curto:
fonte
Se você deseja limitar-se apenas a caracteres hexadecimais, a opção mais simples é gerar um UUID:
Exemplo de saída:
16E3DF0B-87B3-4162-A1A1-E03DB2F59654
.Se você deseja uma sequência aleatória menor, pode pegar apenas os 8 primeiros caracteres.
É um UUID versão 4 que significa que o primeiro caractere no 3º e 4º grupo não é aleatório (eles estarão sempre
4
e um dos8
,9
,A
ouB
).Todos os outros caracteres da sequência são totalmente aleatórios e você pode gerar milhões de UUIDs a cada segundo por centenas de anos, sem muito risco de o mesmo UUID ser gerado duas vezes.
fonte
NSString *uuid = [UUID UUID]
Uma versão de categoria da resposta de Jeff B.
NSString + Random.h
NSString + Random.m
fonte
Você também pode apenas gerar um UUID. Embora não sejam verdadeiramente aleatórios, eles são complexos e únicos, o que os faz parecer aleatórios para a maioria dos usos. Gere um como uma sequência e, em seguida, escolha um intervalo de caracteres igual ao comprimento passado.
fonte
Rápido
fonte
64
por um computadoupperBound
. Eu computoupperBound
fora do bloco porque acho que tem um desempenho melhor.Aqui está uma maneira diferente de lidar com isso. Em vez de usar uma sequência de caracteres preparada, você pode converter entre números inteiros e caracteres e gerar uma lista dinâmica de caracteres para selecionar. É bem enxuto e rápido, mas tem um pouco mais de código.
Quando estou gerando caracteres aleatórios, prefiro trabalhar diretamente com números inteiros e convertê-los em vez de escrever a lista de caracteres dos quais quero extrair. Declarar as variáveis na parte superior o torna mais independente do sistema, mas esse código pressupõe que os números terão um valor menor que as letras e que as maiúsculas terão um valor menor que as minúsculas.
fonte
Solução alternativa em Swift
fonte
Adicionando uma boa resposta dada por Melvin, aqui está uma função que eu criei ( em SWIFT! ) Para obter uma sequência aleatória:
Aqui está um resultado de teste da chamada
randomStringOfLength(10)
: uXa0igA8wmfonte
Gera uma sequência aleatória alfanumérica em minúscula com um determinado comprimento:
fonte
Modificação de algumas idéias aqui e pronto Swift 4.0
Uso:
fonte
Se você deseja uma sequência unicode aleatória, pode criar bytes aleatórios e, em seguida, usar os válidos.
A conversão de NSString para NSData e de volta é necessária para obter uma sequência UTF-8 válida. Esteja ciente de que o comprimento não será necessariamente o comprimento do NSString criado no final.
fonte
Eu fiz isso usando um simples em
char[]
vez de umNSString *
para o alfabeto. Eu adicionei isso a uma categoria NSString.fonte
fonte
Método para chamar:
Método:
Resultados:
fonte
para Swift 3.0
fonte
fonte
Modificação da resposta de keithyip:
fonte