Created
November 9, 2021 17:58
-
-
Save whoyawn/c5ce8fe76d5e32ea0992efddd8d96c55 to your computer and use it in GitHub Desktop.
Generate random passwords with OptionsSet
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
Generate random String of given size in Swift | |
Given a size as n, generate a random alphanumeric String of this size. | |
// elements of Swift CharacterSet are Unicode.Scalar and we cannot view the members so we cannot use CharacterSet. | |
*/ | |
struct CharSet: OptionSet { | |
let rawValue: Int | |
// 1111, each bit represents one value | |
static let lowercase: CharSet = CharSet(rawValue: 1 << 0) | |
static let uppercase: CharSet = CharSet(rawValue: 1 << 1) | |
static let numbers: CharSet = CharSet(rawValue: 1 << 2) | |
static let symbols: CharSet = CharSet(rawValue: 1 << 3) | |
static let all: CharSet = [.lowercase, .uppercase, .numbers, .symbols] | |
} | |
struct PasswordGenerator { | |
var charSet: CharSet = .lowercase | |
mutating func toggleOff(type: CharSet) { | |
charSet.remove(type) | |
} | |
mutating func toggleOn(type: CharSet) { | |
charSet.insert(type) | |
} | |
func generate(n: Int) -> String { | |
assert(n <= 20, "Password too long") | |
var possibleCharacters: [Character] = [] | |
if charSet.contains(.lowercase) { | |
possibleCharacters.append(contentsOf: "abcdefghijklmnopqrstuvwxyz") | |
} | |
if charSet.contains(.uppercase) { | |
possibleCharacters.append(contentsOf: "ABCDEFGHIJKLMNOPQRSTUVWXYZ") | |
} | |
if charSet.contains(.numbers) { | |
possibleCharacters.append(contentsOf: "0123456789") | |
} | |
if charSet.contains(.symbols) { | |
possibleCharacters.append(contentsOf: "!\"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~") | |
} | |
var password: [Character] = [] | |
for _ in 0..<n { | |
password.append(possibleCharacters.randomElement()!) | |
} | |
return String(password) | |
} | |
} | |
var generator = PasswordGenerator() | |
generator.generate(n: 5) | |
generator.toggleOn(type: .uppercase) | |
generator.toggleOn(type: .symbols) | |
generator.toggleOn(type: .numbers) | |
generator.toggleOff(type: .symbols) | |
generator.generate(n: 10) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment