Chcę wywołać metodę, podać jej długość i wygenerować losowy ciąg alfanumeryczny.
Czy są jakieś biblioteki narzędziowe, które mogą mieć kilka tego typu funkcji?
objective-c
cocoa
string
random
alphanumeric
Oddział
źródło
źródło
NSString
for,letters
gdy prostachar
tablica działałaby dobrze. W rzeczywistości użycie[letters characterAtIndex:(rand() % [letters length])]
wydaje mi się mniej zwięzłe niż zwykłeletters[rand() % strlen(letters)]
. Klasy Foundation są naprawdę pomocne, ale w najprostszych rzeczach mogą służyć raczej do zaciemniania naszego kodu niż do jego ulepszania.%C
zamiast%c
, ponieważcharacterAtIndex:
zwracaunichar
arc4random_uniform((int)[letters length])
Nie do końca o to pytasz, ale nadal przydatne:
Przykładowe dane wyjściowe:
źródło
źródło
alphabet
każdego czasu? Jest stała i nie zależy od pętli.NSArray
buforuje swojelength
, nie powinno być wąskim gardłem wydajności.Z pewnością możesz to skrócić:
źródło
Jeśli chcesz ograniczyć się tylko do znaków szesnastkowych, najprostszą opcją jest wygenerowanie UUID:
Przykład Wydajność:
16E3DF0B-87B3-4162-A1A1-E03DB2F59654
.Jeśli chcesz mieć mniejszy losowy ciąg, możesz pobrać tylko pierwsze 8 znaków.
Jest to wersja 4 UUID co oznacza pierwszy znak w grupie 3 i 4 nie jest przypadkowa (zawsze będą
4
i jeden8
,9
,A
lubB
).Każdy inny znak w ciągu jest w pełni losowy i możesz generować miliony identyfikatorów UUID co sekundę przez setki lat bez większego ryzyka, że ten sam UUID zostanie wygenerowany dwukrotnie.
źródło
NSString *uuid = [UUID UUID]
Kategoriaowa wersja odpowiedzi Jeffa B.
NSString + Random.h
NSString + Random. M
źródło
Możesz też po prostu wygenerować UUID. Chociaż nie są naprawdę losowe, są złożone i niepowtarzalne, co sprawia, że w większości zastosowań wydają się losowe. Wygeneruj jeden jako ciąg, a następnie weź zakres znaków równy przekazanej długości.
źródło
Szybki
źródło
64
na obliczoneupperBound
. ObliczamupperBound
poza blokiem, ponieważ myślę, że to działa lepiej.Oto inny sposób rozwiązania tego problemu. Zamiast używać przygotowanego ciągu znaków, możesz rzutować między liczbami całkowitymi i znakami oraz wygenerować dynamiczną listę znaków do wyboru. Jest dość oszczędny i szybki, ale ma nieco więcej kodu.
Kiedy tworzę losowe generowanie znaków, wolę pracować bezpośrednio z liczbami całkowitymi i rzucać je na drugą stronę, zamiast pisać listę znaków, z których chcę narysować. Zadeklarowanie zmiennych u góry czyni je bardziej niezależnymi od systemu, ale ten kod zakłada, że liczby będą miały mniejszą wartość niż litery, a wielkie litery będą miały mniejszą wartość niż małe litery.
źródło
Alternatywne rozwiązanie w Swift
źródło
Dodając do dobrej odpowiedzi udzielonej przez Melvina, oto funkcja, którą wykonałem ( w SWIFT! ), Aby uzyskać losowy ciąg:
Oto wynik testu wywołania
randomStringOfLength(10)
: uXa0igA8wmźródło
Generuje mały alfanumeryczny ciąg losowy o podanej długości:
źródło
Modyfikacja kilku pomysłów tutaj oraz w gotowym Swift 4.0
Stosowanie:
źródło
Jeśli chcesz mieć losowy ciąg znaków Unicode, możesz utworzyć losowe bajty, a następnie użyć prawidłowych.
Konwersja z NSString na NSData iz powrotem jest konieczna, aby uzyskać prawidłowy ciąg znaków UTF-8. Należy pamiętać, że długość niekoniecznie będzie długością utworzonego na końcu ciągu NSS.
źródło
Zrobiłem to za pomocą prostego alfabetu
char[]
zamiastNSString *
litery. Dodałem to do kategorii NSString.źródło
źródło
Sposób połączenia:
Metoda:
Wyniki:
źródło
dla Swift 3.0
źródło
źródło
Modyfikacja odpowiedzi keithyip:
źródło