Generate random alphanumeric string in Swift

前端 未结 22 844
暖寄归人
暖寄归人 2020-11-27 09:51

How can I generate a random alphanumeric string in Swift?

相关标签:
22条回答
  • 2020-11-27 09:57

    You may use it also in the following way:

    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
        }
    }
    

    Simple usage:

    let randomString = String.random()
    

    Swift 3 Syntax:

    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 4 Syntax:

    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
        }
    }
    
    0 讨论(0)
  • 2020-11-27 09:58

    This is the Swift-est solution I could come up with. 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
        } 
    }
    
    0 讨论(0)
  • 2020-11-27 09:59

    Loop free, though it is limited to 43 characters. If you need more, it can be modified. This approach has two advantages over solely using a UUID:

    1. Greater Entropy by using lower case letters, as UUID() only generates upper case letters
    2. A UUID is at most 36 characters long (including the 4 hyphens), but only 32 characters long without. Should you need something longer, or not want hyphens included, the use of the base64EncodedString handles this

    Also, this function makes use of a UInt to avoid negative numbers.

     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))
        }
    

    Calling it in a loop to check output:

    for _ in 0...10 {
        print(generateRandom(size: 32))
    }
    

    Which produces:

    Nzk3NjgzMTdBQ0FBNDFCNzk2MDRENzZF
    MUI5RURDQzE1RTdCNDA3RDg2MTI4QkQx
    M0I3MjJBRjVFRTYyNDFCNkI5OUM1RUVC
    RDA1RDZGQ0IzQjI1NDdGREI3NDgxM0Mx
    NjcyNUQyOThCNzhCNEVFQTk1RTQ3NTIy
    MDkwRTQ0RjFENUFGNEFDOTgyQTUxODI0
    RDU2OTNBOUJGMDE4NDhEODlCNEQ1NjZG
    RjM2MTUxRjM4RkY3NDU2OUFDOTI0Nzkz
    QzUwOTE1N0U1RDVENDE4OEE5NTM2Rjcy
    Nzk4QkMxNUJEMjYwNDJDQjhBQkY5QkY5
    ODhFNjU0MDVEMUI2NEI5QUIyNjNCNkVF
    
    0 讨论(0)
  • 2020-11-27 10:00

    for 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
    }
    
    0 讨论(0)
  • 2020-11-27 10:01

    Swift 4.2 Update

    Swift 4.2 introduced major improvements in dealing with random values and elements. You can read more about those improvements here. Here is the method reduced to a few lines:

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

    Swift 3.0 Update

    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
    }
    

    Original answer:

    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
    }
    
    0 讨论(0)
  • 2020-11-27 10:02

    If you just need a unique identifier, UUID().uuidString may serve your purposes.

    0 讨论(0)
提交回复
热议问题