在Swift中生成随机的字母数字string
如何在Swift中生成一个随机的字母数字string?
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 }
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 }
这是Swiftier语法中的一个现成的解决scheme。 您可以简单地复制并粘贴它:
func randomAlphaNumericString(length: Int) -> String { let allowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" let allowedCharsCount = UInt32(allowedChars.characters.count) var randomString = "" for _ in 0..<length { let randomNum = Int(arc4random_uniform(allowedCharsCount)) let randomIndex = allowedChars.index(allowedChars.startIndex, offsetBy: randomNum) let newCharacter = allowedChars[randomIndex] randomString += String(newCharacter) } return randomString }
如果你更喜欢一个框架 ,也有一些更方便的function,那么随时检查我的项目HandySwift 。 它还包含一个美丽的随机字母数字string解决scheme :
String(randomWithLength: 8, allowedCharactersType: .alphaNumeric) // => "2TgM5sUG"
您也可以通过以下方式使用它:
extension String { static func random(length: Int = 20) -> String { let base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" var randomString: String = "" for _ in 0..<length { let randomValue = arc4random_uniform(UInt32(base.characters.count)) randomString += "\(base[base.startIndex.advancedBy(Int(randomValue))])" } return randomString } }
简单的用法:
let randomString = String.random()
Swift 3语法:
extension String { static func random(length: Int = 20) -> String { let base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" var randomString: String = "" for _ in 0..<length { let randomValue = arc4random_uniform(UInt32(base.characters.count)) randomString += "\(base[base.index(base.startIndex, offsetBy: Int(randomValue))])" } return randomString } }
Swift 2.2版本
// based on https://gist.github.com/samuel-mellert/20b3c99dec168255a046 // which is based on https://gist.github.com/szhernovoy/276e69eb90a0de84dd90 // Updated to work on Swift 2.2 func randomString(length: Int) -> String { let charactersString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" let charactersArray : [Character] = Array(charactersString.characters) var string = "" for _ in 0..<length { string.append(charactersArray[Int(arc4random()) % charactersArray.count]) } return string }
基本上调用这个方法会产生一个随机的string长度的整数交给函数。 要更改可能的字符,只需编辑charactersStringstring。 也支持Unicode字符。
https://gist.github.com/gingofthesouth/54bea667b28a815b2fe33a4da986e327
func randomString(length: Int) -> String { // whatever letters you want to possibly appear in the output (unicode handled properly by Swift) let letters = "abcABC012你好吗😀🐱💥∆𝚹∌⌘" let n = UInt32(letters.characters.count) var out = "" for _ in 0..<length { let index = letters.startIndex.advancedBy(Int(arc4random_uniform(n))) out.append(letters[index]) } return out }
为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 }
迅速:
let randomString = NSUUID().uuidString
我更迅速地实现了这个问题:
func randomAlphanumericString(length: Int) -> String { let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".characters let lettersLength = UInt32(letters.count) let randomCharacters = (0..<length).map { i -> String in let offset = Int(arc4random_uniform(lettersLength)) let c = letters[letters.startIndex.advancedBy(offset)] return String(c) } return randomCharacters.joinWithSeparator("") }
如果你有这种不寻常的情况,可以节省一些人打字
表演很重要。
这是一个非常简单,清晰,自包含的function,caching,
(我想这就是你为了简单而在全球范围内留下的东西。)
func randomNameString(length: Int = 7)->String{ enum s { static let c = Array("abcdefghjklmnpqrstuvwxyz12345789".characters) static let k = UInt32(c.count) } var result = [Character](repeating: "a", count: length) for i in 0..<length { let r = Int(arc4random_uniform(sk)) result[i] = sc[r] } return String(result) }
提示,请注意,在例子中我
避免了“坏”字符
注意,没有0,O,O,I等等,“abcdefghjklmnpqrstuvwxyz12345789”,避免人类在大多数字体中容易混淆的字符。 (这通常是在预订代码等上完成的)
请注意,这里的要点是这是一个固定的,已知的字符集 – 它被caching。
如果您需要另一个字符集,只需制作另一个caching的函数,
func randomVowelsString(length: Int = 20)->String{ enum s { static let c = Array("AEIOU".characters) ...
对于“我需要随机string”问题(无论使用什么语言)的问题,实际上每个解决scheme都使用一个有缺陷的string长度的主要规范。 这些问题本身很less揭示为什么需要随机string,但我会挑战你很less需要随机string的长度,例如8。你总是需要的是一些独特的string ,例如,用作某些目的的标识符。
有两种主要的方式来获得严格唯一的string:确定性(不是随机的)和存储/比较(这是繁重的)。 我们做什么? 我们放弃了鬼魂。 我们用概率唯一性来代替。 也就是说,我们承认,我们的string不会是唯一的(但是很小)。 这是理解碰撞概率和熵有帮助的地方。
所以我将重新说明不可变的需要,因为需要一些重复风险较小的string。 作为一个具体的例子,假设你想要产生500万个ID的潜力。 你不想存储和比较每个新的string,并且你希望它们是随机的,所以你接受一些重复的风险。 举例来说,假设万亿次重复的风险小于1。 那么你需要多长的string呢? 那么,这个问题是不明确的,因为它取决于使用的字符。 但更重要的是,这是错误的。 你需要的是一个规定的string的熵,而不是它们的长度。 熵可以与一些string中重复的概率直接相关。 string长度不能。
这就是像EntropyString这样的库可以提供帮助的地方。 要使用EntropyString
5百万个string在一万亿次重复中具有小于1的随机ID:
import EntropyString let random = Random() let bits = Entropy.bits(for: 5.0e6, risk: 1.0e12) random.string(bits: bits)
“Rrrj6pN4d6GBrFLH4”
EntropyString
默认使用32个字符的字符集。 还有其他预定义的字符集,您也可以指定您自己的字符。 例如,使用与上面相同的熵生成ID,但使用hex字符:
import EntropyString let random = Random(.charSet16) let bits = Entropy.bits(for: 5.0e6, risk: 1.0e12) random.string(bits: bits)
“135fe71aec7a80c02dce5”
注意由于使用的字符集中字符总数的不同,string长度的差异。 在指定数量的潜在string中重复的风险是相同的。 string的长度不是。 最重要的是,重复的风险和潜在的string数量是明确的。 没有更多的猜测与string的长度。
简单和快速 – UUID()。uuidString
//返回从UUID创build的string,例如“E621E1F8-C36C-495A-93FC-0C247A3E6E5F”
public var uuidString:String {get}
Swift 3.0
let randomString = UUID().uuidString //0548CD07-7E2B-412B-AD69-5B2364644433 print(randomString.replacingOccurrences(of: "-", with: "")) //0548CD077E2B412BAD695B2364644433
编辑
请不要混淆 UIDevice.current.identifierForVendor?.uuidString
它不会给随机值。
如果你只需要一个唯一的标识符, UUID().uuidString
你的目的。
这是我能想到的Swift -est解决scheme。 Swift 3.0
extension String { static func random(length: Int) -> String { let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" let randomLength = UInt32(letters.characters.count) let randomString: String = (0 ..< length).reduce(String()) { accum, _ in let randomOffset = arc4random_uniform(randomLength) let randomIndex = letters.index(letters.startIndex, offsetBy: Int(randomOffset)) return accum.appending(String(letters[randomIndex])) } return randomString } }
来自任何CharacterSet
纯Swift随机String
。
用法: CharacterSet.alphanumerics.randomString(length: 100)
extension CharacterSet { /// extracting characters public func allCharacters() -> [Character] { var allCharacters = [Character]() for plane: UInt8 in 0 ... 16 where hasMember(inPlane: plane) { for unicode in UInt32(plane) << 16 ..< UInt32(plane + 1) << 16 { if let uniChar = UnicodeScalar(unicode), contains(uniChar) { allCharacters.append(Character(uniChar)) } } } return allCharacters } /// building random string of desired length public func randomString(length: Int) -> String { let charArray = allCharacters() let charArrayCount = UInt32(charArray.count) var randomString = "" for _ in 0 ..< length { randomString += String(charArray[Int(arc4random_uniform(charArrayCount))]) } return randomString } }
allCharacters()
基于Martin R答案 。
Swift:
只是为了便于理解而简化了。
func randomString(_ length: Int) -> String { let master = Array("abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ_123456789".characters) //0...62 = 63 var randomString = "" for _ in 1...length{ let random = arc4random_uniform(UInt32(master.count)) randomString.append(String(master[Int(random)])) } return randomString }
func randomUIDString(_ wlength: Int) -> String { let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" var randomString = "" for _ in 0 ..< wlength { let length = UInt32 (letters.length) let rand = arc4random_uniform(length) randomString = randomString.appendingFormat("%C", letters.character(at: Int(rand))); } return randomString }