在Cocoa中生成一个随机的字母数字字符串

War*_*ard 141 string random cocoa alphanumeric objective-c

我想调用一个方法,传递它的长度并让它生成一个随机的字母数字字符串.

是否有任何实用程序库可能有一堆这些类型的函数?

Jef*_*f B 309

这是一个快速而肮脏的实现.尚未经过测试.

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 哦编译器会给失去精度的警告,所以最好转换为int`arc4random_uniform((int)[字母长度])` (9认同)
  • 当数组长度不是2的幂时,使用arc4random会产生偏差结果.arc4random_uniform解决了这个问题. (8认同)
  • 只是把它放在那里.当一个简单的`char`数组工作正常时,没有理由使用`NSString`作为`letters`.事实上,使用`[letters characterAtIndex:(rand()%[letters length])]`似乎不仅仅是`字母[rand()%strlen(letters)]`.基础课程非常有用,但对于最简单的事情,它们可以用来代替我们的代码而不是增强代码. (5认同)
  • 你应该使用`arc4random_uniform()`来避免模偏差. (5认同)
  • 你可能想要`%C`而不是`%c`,因为`characterAtIndex:`返回`unichar` (3认同)

小智 103

不完全是你问的,但仍然有用:

[[NSProcessInfo processInfo] globallyUniqueString]
Run Code Online (Sandbox Code Playgroud)

样本输出:

450FEA63-2286-4B49-8ACC-9822C7D4356B-1376-00000239A4AC4FD5
Run Code Online (Sandbox Code Playgroud)

  • 这对于大多数用途来说可能没问题,但如果出于安全目的需要随机字符串,请不要使用.独特!=随机.长度是恒定的,使用的字符范围是有限的(0-9,AF, - = 17,而aZ.0-9为62).此字符串是唯一但可预测的. (5认同)
  • 这是解决这个问题的最短,最直接的方法. (2认同)

Mel*_*vin 67

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];
}
Run Code Online (Sandbox Code Playgroud)

  • 你真的需要每次查询`alphabet`的长度吗?它是常量,不依赖于循环. (13认同)

Joh*_*ato 43

当然你可以缩短它:

+(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;
}
Run Code Online (Sandbox Code Playgroud)

  • 唯一的缺点是它不是真正的字母数字,而只是小写字母.;-) (9认同)
  • 这个没什么不对.这是一个很好的简洁解决方案.(我希望SO会对downvotes强制执行评论.) (5认同)
  • 为什么-1?这完全没有错.它就像是所有答案中最小的最优化的. (2认同)

Abh*_*ert 26

如果您愿意仅限于十六进制字符,那么最简单的选择是生成一个UUID:

NSString *uuid = [NSUUID UUID].UUIDString;
Run Code Online (Sandbox Code Playgroud)

示例输出:16E3DF0B-87B3-4162-A1A1-E03DB2F59654.

如果你想要一个较小的随机字符串,那么你只需要获取前8个字符.

这是一个版本4 UUID这意味着第三和第四组中的第一个字符不是随机的(它们将始终是4和之一8,9,AB).

字符串中的每个其他字符都是完全随机的,您可以在数百年内每秒生成数百万个UUID,而不会产生两次生成相同UUID的风险.

  • NSString*uuid = [UUID UUID] .UUIDString; 会给你错误"使用未声明的标识符UUID",所以只需对代码进行一些小改动就可以使用NSString*uuid = [NSUUID UUID] .UUIDString; (3认同)

kei*_*yip 24

Jeff B答案的类别版本.

的NSString + Random.h

#import <Foundation/Foundation.h>

@interface NSString (Random)

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

@end
Run Code Online (Sandbox Code Playgroud)

的NSString + Random.m

#import "NSString+Random.h"

 @implementation NSString (Random)

+ (NSString *)randomAlphanumericStringWithLength:(NSInteger)length
{ 
    NSString *letters = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    NSMutableString *randomString = [NSMutableString stringWithCapacity:length];

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

    return randomString;
}

@end
Run Code Online (Sandbox Code Playgroud)


Tec*_*Zen 7

您也可以生成一个UUID.虽然不是真正随机的,但它们复杂且独特,这使得它们在大多数用途中看起来是随机的 生成一个字符串,然后取一个等于传递长度的字符范围.


ma1*_*w28 5

迅速

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)))]
    })
}
Run Code Online (Sandbox Code Playgroud)