python uuid1是顺序作为时间戳吗?

Car*_*res 12 python uuid

Python 文档声明uuid1使用当前时间来形成uuid值.但我找不到确保UUID1顺序的引用.

>>> import uuid
>>> u1 = uuid.uuid1()
>>> u2 = uuid.uuid1()
>>> u1 < u2
True
>>> 
Run Code Online (Sandbox Code Playgroud)

Sco*_*ter 15

但不总是:

>>> def test(n):
...     old = uuid.uuid1()
...     print old
...     for x in range(n):
...             new = uuid.uuid1()
...             if old >= new:
...                     print "OOops"
...                     break
...             old = new
...     print new
>>> test(1000000)
fd4ae687-3619-11e1-8801-c82a1450e52f
OOops
00000035-361a-11e1-bc9f-c82a1450e52f
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 11

UUID不是连续的

不,标准UUID 并不意味着是顺序的.

显然,一些尝试是使用GUID(微软在UUID上的扭曲)使它们顺序地帮助在某些数据库场景中的性能.但是顺序不是 UUID 的意图. http://en.wikipedia.org/wiki/Globally_unique_identifier

MAC是最后的,不是第一个

不,在标准UUID中,MAC地址不是第一个组件.MAC地址是版本1 UUID中的最后一个组件. http://en.wikipedia.org/wiki/Universally_unique_identifier

不要假设哪种类型的UUID

各种版本的UUID旨在相互兼容.因此,期望您始终拥有版本1 UUID可能是不合理的.其他程序员可能会使用其他版本.

规格

阅读UUID规范,RFC 4122,由IETF.只有十几页.


dcr*_*sta 5

python UUID文档:

从主机ID,序列号和当前时间生成UUID.如果未给出node,则使用getnode()来获取硬件地址.如果给出clock_seq,则将其用作序列号; 否则,选择随机的14位序列号.

由此,我推断MAC地址是第一个,然后是(可能是随机的)序列号,然后是当前时间.因此,即使对于由同一台机器/进程生成的UUID,我也不希望保证这些单调增加.

  • 不,MAC地址不是*不是第一个.阅读[UUID规范](http://tools.ietf.org/html/rfc4122#section-4.1.2). (2认同)

kon*_*ity 5

我在 Cassandra/Python 中偶然发现了一个可能的答案:http://doanduyhai.wordpress.com/2012/07/05/apache-cassandra-tricks-and-traps/

\n\n

字典时间UUID排序

\n\n

Cassandra 在所有基元类型中提供对类型 1(基于时间和服务器)和类型 4(随机)的 UUID 值的支持。

\n\n

UUID(唯一通用标识符)的主要用途是在潜在的分布式环境中获取真正唯一的标识符。

\n\n

Cassandra 支持版本 1 UUID。它通过结合计算机\xe2\x80\x99s MAC 地址和自公历开始以来的 100 纳秒间隔数,为您提供唯一标识符。

\n\n

正如您所看到的,精度仅为 100 纳秒,但幸运的是它与时钟序列混合以添加随机性。此外,MAC 地址还用于计算 UUID,因此 \xe2\x80\x99 不太可能在一个机器集群上遇到冲突,除非你需要处理非常大量的数据(don\xe2\x80\ x99t 忘了,不是每个人都是 Twitter 或 Facebook)。

\n\n

UUID(尤其是 TimeUUID)最相关的用例之一是将其用作列键。由于 Cassandra 列键已排序,因此我们可以利用此功能为列族进行自然排序。

\n\n

Hector 客户端提供的默认 com.eaio.uuid.UUID 的问题是它\xe2\x80\x99s 不容易使用。作为 ID,您可能需要将此值从服务器带到视图层,而 \xe2\x80\x99 就是问题所在。

\n\n

基本上,com.eaio.uuid.UUID 重写 toString() 以给出 UUID 的字符串表示形式。但是,此字符串格式无法按字典顺序排序\xe2\x80\xa6

\n\n

下面是一些连续生成的TimeUUID:

\n\n
8e4cab00-c481-11e1-983b-20cf309ff6dc at some t1\n2b6e3160-c482-11e1-addf-20cf309ff6dc at some t2 with t2 > t1\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\x9c2b6e3160-c482-11e1-addf-20cf309ff6dc\xe2\x80\x9d.compareTo(\xe2\x80\x9c8e4cab00-c481-11e1-983b-20cf309ff6dc\xe2\x80\x9d)给出 -6 表示\xe2\x80\x9c2b6e3160-c482-11e1-addf-20cf309ff6dc\xe2\x80\x9d小于/之前\xe2\x80\x9c8e4cab00-c481-11e1-983b-20cf309ff6dc\xe2\x80\x9d x9d是不正确的。

\n\n

当前TimeUUID的文本显示分割如下:

\n\n
time_low \xe2\x80\x93 time_mid \xe2\x80\x93 time_high_and_version \xe2\x80\x93 variant_and_sequence \xe2\x80\x93 node\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我们从 time_high_and_version 开始重新排序,我们就可以按字典顺序对其进行排序:

\n\n
time_high_and_version \xe2\x80\x93 time_mid \xe2\x80\x93 time_low \xe2\x80\x93 variant_and_sequence \xe2\x80\x93 node\n
Run Code Online (Sandbox Code Playgroud)\n\n

实用程序类如下:

\n\n
public static String reorderTimeUUId(String originalTimeUUID)\n    {\n        StringTokenizer tokens = new StringTokenizer(originalTimeUUID, "-");\n        if (tokens.countTokens() == 5)\n        {\n            String time_low = tokens.nextToken();\n            String time_mid = tokens.nextToken();\n            String time_high_and_version = tokens.nextToken();\n            String variant_and_sequence = tokens.nextToken();\n            String node = tokens.nextToken();\n\n            return time_high_and_version + \'-\' + time_mid + \'-\' + time_low + \'-\' + variant_and_sequence + \'-\' + node;\n\n        }\n\n        return originalTimeUUID;\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

TimeUUID 变为:

\n\n
public static String reorderTimeUUId(String originalTimeUUID)\n    {\n        StringTokenizer tokens = new StringTokenizer(originalTimeUUID, "-");\n        if (tokens.countTokens() == 5)\n        {\n            String time_low = tokens.nextToken();\n            String time_mid = tokens.nextToken();\n            String time_high_and_version = tokens.nextToken();\n            String variant_and_sequence = tokens.nextToken();\n            String node = tokens.nextToken();\n\n            return time_high_and_version + \'-\' + time_mid + \'-\' + time_low + \'-\' + variant_and_sequence + \'-\' + node;\n\n        }\n\n        return originalTimeUUID;\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我们得到:

\n\n
"11e1-c481-8e4cab00-983b-20cf309ff6dc".compareTo("11e1-c482-2b6e3160-addf-20cf309ff6dc") = -1\n
Run Code Online (Sandbox Code Playgroud)\n