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

时间:2016-12-19 22:31:37

标签: ios swift uuid

这个问题是关于 Swift

Swift 中生成一个rfc UUID很容易获得一个Swift String,因为在这个阶段Apple已经为它制作了一个Swift方法...

func sfUUID()->String
    {
    return UUID().uuidString.lowercased()
    }

使用 Swift

时,我需要一个旧式的“版本1”UUID

(例如:https://picload.org/image/ralwaarg/jquerymobile.png

有没有办法在 Swift3 中执行此操作? (仅限> 9)

Swift 中,如何获取版本1 UUID。因此,UUID()调用可能有一些我不知道的选项,或者调用C调用并将结果安全地作为String进行调整很困难。

2 个答案:

答案 0 :(得分:5)

Callam的link才是真正的答案。 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)

答案 1 :(得分:2)

这是我提出的用于进行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 ?? ""
}

示例输出

e8d1eb6e-c65f-11e6-bb89-a0999b112ea2
e8d1ed1c-c65f-11e6-bb89-a0999b112ea2
e8d1ed4e-c65f-11e6-bb89-a0999b112ea2

不同的物理设备

c83fdf22-c660-11e6-aca6-11ad80a9c011
c83fe6e8-c660-11e6-aca6-11ad80a9c011
c83fe904-c660-11e6-aca6-11ad80a9c011