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)