Swift3中的UUID,但是使用“版本1”的样式UUID

3
这个问题涉及到 Swift
Swift 中生成 rfc UUID 非常容易,只需获取一个 Swift String,因为苹果已经为此提供了一个 Swift 方法...
func sfUUID()->String
    {
    return UUID().uuidString.lowercased()
    }

我需要一种旧式的“版本1”UUID,在使用Swift时
(示例:https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_1_.28date-time_and_MAC_address.29
在Swift3中有没有办法做到这一点?(仅限>9)
在Swift中,如何获得版本1 UUID。因此,在UUID()调用上可能有一些我不知道的选项,或者存在调用C调用并将结果安全地作为String获取的难度。

2
请参考以下链接:http://stackoverflow.com/questions/15501914/time-based-uuid-version-1-on-ios - Callam
嗨@Callam,感谢您提供的链接,这是一个Swift问题。 - Fattie
1
该方法在Swift中仍然可用。 - Callam
嘿@Callam。再次感谢您提供的优秀链接。我立即为您的评论点赞,尽可能地点赞。显然我在问题中的意思是“如何生成一个String”。原生的 Swift 调用 uuids (UUID()) 还没有(或者我错了)“版本1”的选项。相反,从 C 调用获取到 Swift String 非常困难(对我来说很困难)。Rob 提供了一个重要的代码块,我也试着动手写了一下(作为专家,您可能能够批评一下我的代码?) - Fattie
2个回答

6

Callam的链接是真正的答案。Swift可以(并且在这种情况下必须)调用C,因此您实际上只需要C函数的名称。

但是,“Swift”问题在于如何从Swift调用C函数,这是一项比这个特定问题更重要的通用技能(并且当前文档中没有很好的解释)。因此,值得研究以下内容的工作原理,而不仅仅将其视为“如何在Swift中生成v1 UUID”的答案。

var uuid: uuid_t = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
withUnsafeMutablePointer(to: &uuid) {
    $0.withMemoryRebound(to: UInt8.self, capacity: 16) {
        uuid_generate_time($0)
    }
}

let finalUUID = UUID(uuid: uuid)

没什么大不了的:你认为下面的“MemoryLayout”方法看起来还可以吗? - Fattie
1
似乎更加困难。为什么要手动处理所有字符串?Swift可以轻松、安全地为您完成所有这些工作。从uuid_t生成一个UUID,如果您想要一个字符串版本,只需请求其uuidString即可。但我没有看到任何特别的问题。 - Rob Napier
这个解决方案还能更快地执行,应该是一个被接受的答案。 - Raikerian

3

这已经非常过时了,请不要再这样做。

我想删除这个答案,但它已经被选中了!

以下是获取C调用的Swift代码...

func generateVersionOneAkaTimeBasedUUID() -> String {

    // figure out the sizes

    let uuidSize = MemoryLayout<uuid_t>.size
    let uuidStringSize = MemoryLayout<uuid_string_t>.size

    // get some ram

    let uuidPointer = UnsafeMutablePointer<UInt8>.allocate(capacity: uuidSize)
    let uuidStringPointer = UnsafeMutablePointer<Int8>.allocate(capacity: uuidStringSize)

    // do the work in C

    uuid_generate_time(uuidPointer)
    uuid_unparse(uuidPointer, uuidStringPointer)

    // make a Swift string while we still have the C stuff

    let uuidString = NSString(utf8String: uuidStringPointer) as? String

    // avoid leaks

    uuidPointer.deallocate(capacity: uuidSize)
    uuidStringPointer.deallocate(capacity: uuidStringSize)

    assert(uuidString != nil, "uuid (V1 style) failed")
    return uuidString ?? ""
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接