在Swift中生成随机的字母数字字符串

vis*_*hnu 186 string swift

如何在Swift中生成随机字母数字字符串?

iAh*_*med 315

func randomString(length: Int) -> String {
  let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  return String((0..<length).map{ _ in letters.randomElement()! })
}
Run Code Online (Sandbox Code Playgroud)

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

Swift 4.2更新

Swift 4.2在处理随机值和元素方面引入了重大改进.您可以在此处详细了解这些改进.这里的方法简化为几行:

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

  • randomString(length:6)或randomString(length:8) (4认同)

Jee*_*hut 57

这是一个使用Swiftier语法的现成解决方案.您只需复制并粘贴它即可:

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

如果您更喜欢具有更多便捷功能的框架,请随时查看我的项目HandySwift.它还包括一个美丽的随机字母数字字符串解决方案:

String(randomWithLength: 8, allowedCharactersType: .alphaNumeric) // => "2TgM5sUG"
Run Code Online (Sandbox Code Playgroud)


Bar*_*zyk 46

您也可以通过以下方式使用它:

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

用法简单:

let randomString = String.random()
Run Code Online (Sandbox Code Playgroud)

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

Swift 4语法:

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.count))
            randomString += "\(base[base.index(base.startIndex, offsetBy: Int(randomValue))])"
        }
        return randomString
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 26

迅速:

let randomString = NSUUID().uuidString
Run Code Online (Sandbox Code Playgroud)

  • UUID有时给出相同的字符串! (2认同)
  • UUID 有多种类型,其中一些是基于时间的。[Swift Foundation使用的是V4,随机](https://developer.apple.com/documentation/foundation/uuid)。相同的 UUID 生成两次的可能性非常小(例如,[难以置信的小](https://en.wikipedia.org/wiki/Universally_unique_identifier#Collisions))。 (2认同)

leo*_*ion 10

使用Swift 4.2,最好的办法是创建一个包含所需字符的字符串,然后使用randomElement选择每个字符:

let length = 32
let characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let randomCharacters = (0..<length).map{_ in characters.randomElement()!}
let randomString = String(randomCharacters)
Run Code Online (Sandbox Code Playgroud)

在这里详细介绍了这些变化.

  • 您可以使用compactMap代替map,然后就不需要了!操作员。;) (2认同)

Jal*_*zir 7

简单快速 - UUID().uuidString

//返回从UUID创建的字符串,例如"E621E1F8-C36C-495A-93FC-0C247A3E6E5F"

public var uuidString:String {get}

https://developer.apple.com/documentation/foundation/uuid

Swift 3.0

let randomString = UUID().uuidString //0548CD07-7E2B-412B-AD69-5B2364644433
print(randomString.replacingOccurrences(of: "-", with: ""))
//0548CD077E2B412BAD695B2364644433
Run Code Online (Sandbox Code Playgroud)

编辑

请不要混淆UIDevice.current.identifierForVendor?.uuidString它不会给随机值.


Cod*_*der 7

无循环,但限制为 43 个字符。如果需要更多,可以修改。与仅使用 UUID 相比,此方法有两个优点:

  1. 通过使用小写字母来获得更大的熵,因为UUID()仅生成大写字母
  2. AUUID最多 36 个字符长(包括 4 个连字符),但不包括 4 个连字符则只有 32 个字符长。如果您需要更长的内容,或者不希望包含连字符,请使用base64EncodedString句柄

此外,该函数还使用 aUInt来避免负数。

 func generateRandom(size: UInt) -> String {
        let prefixSize = Int(min(size, 43))
        let uuidString = UUID().uuidString.replacingOccurrences(of: "-", with: "")
        return String(Data(uuidString.utf8)
            .base64EncodedString()
            .replacingOccurrences(of: "=", with: "")
            .prefix(prefixSize))
    }
Run Code Online (Sandbox Code Playgroud)

在循环中调用它来检查输出:

for _ in 0...10 {
    print(generateRandom(size: 32))
}
Run Code Online (Sandbox Code Playgroud)

其产生:

Nzk3NjgzMTdBQ0FBNDFCNzk2MDRENzZF
MUI5RURDQzE1RTdCNDA3RDg2MTI4QkQx
M0I3MjJBRjVFRTYyNDFCNkI5OUM1RUVC
RDA1RDZGQ0IzQjI1NDdGREI3NDgxM0Mx
NjcyNUQyOThCNzhCNEVFQTk1RTQ3NTIy
MDkwRTQ0RjFENUFGNEFDOTgyQTUxODI0
RDU2OTNBOUJGMDE4NDhEODlCNEQ1NjZG
RjM2MTUxRjM4RkY3NDU2OUFDOTI0Nzkz
QzUwOTE1N0U1RDVENDE4OEE5NTM2Rjcy
Nzk4QkMxNUJEMjYwNDJDQjhBQkY5QkY5
ODhFNjU0MDVEMUI2NEI5QUIyNjNCNkVF
Run Code Online (Sandbox Code Playgroud)


fal*_*fal 7

对于不想输入整个字符集的人:

func randomAlphanumericString(length: Int) -> String  {
    enum Statics {
        static let scalars = [UnicodeScalar("a").value...UnicodeScalar("z").value,
                              UnicodeScalar("A").value...UnicodeScalar("Z").value,
                              UnicodeScalar("0").value...UnicodeScalar("9").value].joined()

        static let characters = scalars.map { Character(UnicodeScalar($0)!) }
    }

    let result = (0..<length).map { _ in Statics.characters.randomElement()! }
    return String(result)
}
Run Code Online (Sandbox Code Playgroud)


Sre*_*h G 7

斯威夫特 5.0

// Generating Random String
func randomString(length: Int) -> String {
    let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    return String((0..<length).map{ _ in letters.randomElement()! })
}
// Calling to string
label.text = randomString(length: 3)
Run Code Online (Sandbox Code Playgroud)


Ern*_*ham 6

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

基本上调用这个方法会生成一个随机字符串,该字符串是传递给函数的整数的长度.要更改可能的字符,只需编辑charactersString字符串即可.也支持unicode字符.

https://gist.github.com/gingofthesouth/54bea667b28a815b2fe33a4da986e327

  • 出于某些不幸的原因,这个版本偶尔会出现一个'EXC_BAD_INSTRUCTION` (2认同)

Cœu*_*œur 6

String来自 any 的纯 Swift 随机数CharacterSet

用法: CharacterSet.alphanumerics.randomString(length: 100)

extension CharacterSet {
    /// extracting characters
    /// /sf/answers/3649355321/
    public func characters() -> [Character] {
        return codePoints().compactMap { UnicodeScalar($0) }.map { Character($0) }
    }
    public func codePoints() -> [Int] {
        var result: [Int] = []
        var plane = 0
        for (i, w) in bitmapRepresentation.enumerated() {
            let k = i % 8193
            if k == 8192 {
                plane = Int(w) << 13
                continue
            }
            let base = (plane + k) << 3
            for j in 0 ..< 8 where w & 1 << j != 0 {
                result.append(base + j)
            }
        }
        return result
    }

    /// building random string of desired length
    /// /sf/answers/3002662491/
    public func randomString(length: Int) -> String {
        let charArray = characters()
        let charArrayCount = UInt32(charArray.count)
        var randomString = ""
        for _ in 0 ..< length {
            randomString += String(charArray[Int(arc4random_uniform(charArrayCount))])
        }
        return randomString
    }
}
Run Code Online (Sandbox Code Playgroud)

characters()函数是我已知的最快的实现


S1L*_*IOR 5

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


Fat*_*tie 5

更新于2019。

在不寻常的情况下

性能很重要。

缓存非常清晰的功能:

func randomNameString(length: Int = 7)->String{

    enum s {
        static let c = Array("abcdefghjklmnpqrstuvwxyz12345789")
        static let k = UInt32(c.count)
    }

    var result = [Character](repeating: "-", count: length)

    for i in 0..<length {
        let r = Int(arc4random_uniform(s.k))
        result[i] = s.c[r]
    }

    return String(result)
}
Run Code Online (Sandbox Code Playgroud)

这适用于您拥有固定的已知字符集的情况。

方便提示:

请注意,“ abcdefghjklmnpqrstuvwxyz12345789”避免使用“错误”字符

没有0,o,o,i等...人类经常混淆的字符。

通常对预订代码和人类客户将使用的类似代码执行此操作。