Генерация случайной буквенно-цифровой строки в какао - PullRequest
140 голосов
/ 14 апреля 2010

Я хочу вызвать метод, передать ему длину и сгенерировать случайную буквенно-цифровую строку.

Существуют ли какие-либо служебные библиотеки, которые могут иметь набор функций такого типа?

Ответы [ 20 ]

308 голосов
/ 14 апреля 2010

Вот быстрая и грязная реализация. Не был проверен.

NSString *letters = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

-(NSString *) randomStringWithLength: (int) len {

    NSMutableString *randomString = [NSMutableString stringWithCapacity: len];

    for (int i=0; i<len; i++) {
         [randomString appendFormat: @"%C", [letters characterAtIndex: arc4random_uniform([letters length])]];
    }

    return randomString;
}
102 голосов
/ 18 января 2014

Не совсем то, что вы просите, но все же полезно:

[[NSProcessInfo processInfo] globallyUniqueString]

Пример вывода:

450FEA63-2286-4B49-8ACC-9822C7D4356B-1376-00000239A4AC4FD5
67 голосов
/ 03 января 2012
NSString *alphabet  = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789";
NSMutableString *s = [NSMutableString stringWithCapacity:20];
for (NSUInteger i = 0U; i < 20; i++) {
    u_int32_t r = arc4random() % [alphabet length];
    unichar c = [alphabet characterAtIndex:r];
    [s appendFormat:@"%C", c];
}
42 голосов
/ 10 мая 2013

Конечно, вы можете сделать это короче:

+(NSString*)generateRandomString:(int)num {
    NSMutableString* string = [NSMutableString stringWithCapacity:num];
    for (int i = 0; i < num; i++) {
        [string appendFormat:@"%C", (unichar)('a' + arc4random_uniform(26))];
    }
    return string;
}
25 голосов
/ 19 февраля 2014

Если вы хотите ограничиться только шестнадцатеричными символами, тогда самый простой вариант - сгенерировать UUID:

NSString *uuid = [NSUUID UUID].UUIDString;

Пример вывода: 16E3DF0B-87B3-4162-A1A1-E03DB2F59654.

Если вам нужна случайная строка меньшего размера, вы можете получить только первые 8 символов.

Это UUID версии 4, что означает, что первый символ в 3-й и 4-й группе не является случайным (они всегда будут 4 и один из 8, 9, A или B).

Каждый другой символ в строке является полностью случайным, и вы можете генерировать миллионы UUID каждую секунду в течение сотен лет без большого риска того, что один и тот же UUID будет сгенерирован дважды.

24 голосов
/ 07 марта 2013

Версия категории ответа Джеффа Б.

NSString + Random.h

#import <Foundation/Foundation.h>

@interface NSString (Random)

+ (NSString *)randomAlphanumericStringWithLength:(NSInteger)length;

@end

NSString + Случайный.

7 голосов
/ 14 апреля 2010

Вы также можете просто сгенерировать UUID.Хотя они не совсем случайны, они сложны и уникальны, что делает их случайными в большинстве случаев.Сгенерируйте один как строку и затем возьмите диапазон символов, равный переданной длине.

5 голосов
/ 20 июня 2015

Swift

func randomStringWithLength(length: Int) -> String {
    let alphabet = "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    let upperBound = UInt32(count(alphabet))
    return String((0..<length).map { _ -> Character in
        return alphabet[advance(alphabet.startIndex, Int(arc4random_uniform(upperBound)))]
    })
}
4 голосов
/ 13 сентября 2012

Вот другой способ справиться с этим. Вместо использования подготовленной строки символов вы можете приводить между целыми числами и символами и генерировать динамический список символов для выбора. Он довольно скудный и быстрый, но имеет немного больше кода.

int charNumStart = (int) '0';
int charNumEnd = (int) '9';
int charCapitalStart = (int) 'A';
int charCapitalEnd = (int) 'Z';
int charLowerStart = (int) 'a';
int charLowerEnd = (int) 'z';

int amountOfChars = (charNumEnd - charNumStart) + (charCapitalEnd - charCapitalStart) + (charLowerEnd - charLowerStart); // amount of the characters we want.
int firstGap = charCapitalStart - charNumEnd; // there are gaps of random characters between numbers and uppercase letters, so this allows us to skip those.
int secondGap = charLowerStart - charCapitalEnd; // similar to above, but between uppercase and lowercase letters.

// START generates a log to show us which characters we are considering for our UID.
NSMutableString *chars = [NSMutableString stringWithCapacity:amountOfChars];
for (int i = charNumStart; i <= charLowerEnd; i++) {
    if ((i >= charNumStart && i <= charNumEnd) || (i >= charCapitalStart && i <= charCapitalEnd) || (i >= charLowerStart && i <= charLowerEnd)) {
        [chars appendFormat:@"\n%c", (char) i];
    }
}
NSLog(@"chars: %@", chars);
// END log

// Generate a uid of 20 characters that chooses from our desired range.
int uidLength = 20;
NSMutableString *uid = [NSMutableString stringWithCapacity:uidLength];
for (int i = 0; i < uidLength; i++) {
    // Generate a random number within our character range.
    int randomNum = arc4random() % amountOfChars;
    // Add the lowest value number to line this up with a desirable character.
    randomNum += charNumStart;
    // if the number is in the letter range, skip over the characters between the numbers and letters.
    if (randomNum > charNumEnd) {
        randomNum += firstGap;
    }
    // if the number is in the lowercase letter range, skip over the characters between the uppercase and lowercase letters.
    if (randomNum > charCapitalEnd) {
        randomNum += secondGap;
    }
    // append the chosen character.
    [uid appendFormat:@"%c", (char) randomNum];
}
NSLog(@"uid: %@", uid);

// Generate a UID that selects any kind of character, including a lot of punctuation. It's a bit easier to do it this way.
int amountOfAnyCharacters = charLowerEnd - charNumStart; // A new range of characters.
NSMutableString *multiCharUid = [NSMutableString stringWithCapacity:uidLength];
for (int i = 0; i < uidLength; i++) {
    // Generate a random number within our new character range.
    int randomNum = arc4random() % amountOfAnyCharacters;
    // Add the lowest value number to line this up with our range of characters.
    randomNum += charNumStart;
    // append the chosen character.
    [multiCharUid appendFormat:@"%c", (char) randomNum];
}
NSLog(@"multiCharUid: %@", multiCharUid);

Когда я выполняю генерацию случайных символов, я предпочитаю работать непосредственно с целыми числами и приводить их вместо написания списка символов, из которых я хочу извлечь. Объявление переменных в верхней части делает их более независимыми от системы, но этот код предполагает, что числа будут иметь более низкое значение, чем буквы, и что заглавные буквы будут иметь меньшее значение, чем строчные.

3 голосов
/ 27 февраля 2015

Альтернативное решение в Swift

func generateString(len: Int) -> String {
    let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    let lettersLength = UInt32(countElements(letters))
    let result = (0..<len).map { _ -> String in
        let idx = Int(arc4random_uniform(lettersLength))
        return String(letters[advance(letters.startIndex, idx)])
    }
    return "".join(result)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...