I was just working with some messy data, and realized I need a deterministic way to generate UUIDs from 2 strings in an iOS project. Looks like the only standard method available is
UUID(uuidString: String)
The problem with this is sometimes we don't have the formatted uuidString, so turns out we need to build it ourselves.
Enough talk, here's the code:
import Foundation
import CommonCrypto
func createHash(from string1: String, and string2: String) -> Data {
let concatenatedString = string1 + string2
guard let data = concatenatedString.data(using: .utf8) else {
return Data()
}
var digest = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
_ = data.withUnsafeBytes {
CC_SHA256($0.baseAddress, UInt32(data.count), &digest)
}
return Data(digest)
}
func generateNonRandomUUID(from string1: String, and string2: String) -> UUID {
let hashData = createHash(from: string1, and: string2)
// Truncate the hash data to 128 bits (16 bytes)
let truncatedHashData = hashData.prefix(16)
// Create a byte array (UnsafePointer<UInt8>) from the truncated hash data
var byteArray: [UInt8] = []
truncatedHashData.withUnsafeBytes {
byteArray.append(contentsOf: $0)
}
// Create a UUID from the byte array
let uuid = NSUUID(uuidBytes: byteArray)
return uuid as UUID
}
Happy coding!
Top comments (0)