【问题标题】:Swift - time based UUID - how to sort themSwift - 基于时间的 UUID - 如何对它们进行排序
【发布时间】:2016-02-26 00:36:21
【问题描述】:

我正在为项目创建和使用时基 UUID。我正在使用这个功能:

  class func timeBasedUUID() -> NSUUID {
    let uuidSize = sizeof(uuid_t)
    let uuidPointer = UnsafeMutablePointer<UInt8>.alloc(uuidSize)
    uuid_generate_time(uuidPointer)
    let uuid = NSUUID(UUIDBytes: uuidPointer)
    uuidPointer.dealloc(uuidSize)
    return uuid
  }

现在我想知道如何将它们从最旧到最新排序。我在考虑比较字符串,但它是正确的吗?因为我不这么认为。

【问题讨论】:

  • 你有没有找到一种方法从这里获取时间戳?
  • KSUID 最适合此类工作。

标签: ios swift sorting datetime uuid


【解决方案1】:

UUID 没有“最旧”或“最新”组件。确实,uuid_generate_time 使用时间来帮助保证唯一性,但它并不是一种实际记录时间的方式。不要试图以这种方式滥用它。如果您知道您需要按日期对项目进行排序,则需要给他们一些额外的信息,例如时间戳。

【讨论】:

  • 谢谢,我在想,当我使用基于时间的 uuid 时,它可以反向获取时间。
  • 这令人困惑。毕竟,例如在 Java 中,它是(重新)从 uuid 生成时间戳的基本方法。你有这个声明的来源吗?
  • @matt,有没有办法从类似于 Java 的 UUID 中获取时间戳?
【解决方案2】:

在 swift 中从 UUIDv1 解码时间戳:

extension UUID {
    static func timeBasedUUID() -> UUID? {
        let uuidSize = MemoryLayout<uuid_t>.size
        let uuidPointer = UnsafeMutablePointer<UInt8>.allocate(capacity: uuidSize)
        uuid_generate_time(uuidPointer)
        let uuid = uuidPointer.withMemoryRebound(to: uuid_t.self, capacity: 1) {
            return $0.pointee
        }

        uuidPointer.deallocate()
        return UUID(uuid: uuid)
    }

    var timestamp: TimeInterval {
        let components = uuidString.split(separator: "-")
        assert(components.count == 5)
        let hex = String(components[2].dropFirst()) + components[1] + components[0]
        // 100-nanoseconds intervals
        let interval = Int(hex, radix: 16)!
        let seconds = TimeInterval(interval / 10000000)

        // -12219292800 relative seconds to 1970
        return seconds - 12219292800
    }
}

参考:

【讨论】:

    猜你喜欢
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多