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 并不意味着是顺序的.
显然,一些尝试是使用GUID(微软在UUID上的扭曲)使它们顺序地帮助在某些数据库场景中的性能.但是顺序不是 UUID 的意图. http://en.wikipedia.org/wiki/Globally_unique_identifier
不,在标准UUID中,MAC地址不是第一个组件.MAC地址是版本1 UUID中的最后一个组件. http://en.wikipedia.org/wiki/Universally_unique_identifier
各种版本的UUID旨在相互兼容.因此,期望您始终拥有版本1 UUID可能是不合理的.其他程序员可能会使用其他版本.
阅读UUID规范,RFC 4122,由IETF.只有十几页.
从主机ID,序列号和当前时间生成UUID.如果未给出node,则使用getnode()来获取硬件地址.如果给出clock_seq,则将其用作序列号; 否则,选择随机的14位序列号.
由此,我推断MAC地址是第一个,然后是(可能是随机的)序列号,然后是当前时间.因此,即使对于由同一台机器/进程生成的UUID,我也不希望保证这些单调增加.
我在 Cassandra/Python 中偶然发现了一个可能的答案:http://doanduyhai.wordpress.com/2012/07/05/apache-cassandra-tricks-and-traps/
\n\nCassandra 在所有基元类型中提供对类型 1(基于时间和服务器)和类型 4(随机)的 UUID 值的支持。
\n\nUUID(唯一通用标识符)的主要用途是在潜在的分布式环境中获取真正唯一的标识符。
\n\nCassandra 支持版本 1 UUID。它通过结合计算机\xe2\x80\x99s MAC 地址和自公历开始以来的 100 纳秒间隔数,为您提供唯一标识符。
\n\n正如您所看到的,精度仅为 100 纳秒,但幸运的是它与时钟序列混合以添加随机性。此外,MAC 地址还用于计算 UUID,因此 \xe2\x80\x99 不太可能在一个机器集群上遇到冲突,除非你需要处理非常大量的数据(don\xe2\x80\ x99t 忘了,不是每个人都是 Twitter 或 Facebook)。
\n\nUUID(尤其是 TimeUUID)最相关的用例之一是将其用作列键。由于 Cassandra 列键已排序,因此我们可以利用此功能为列族进行自然排序。
\n\nHector 客户端提供的默认 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\n8e4cab00-c481-11e1-983b-20cf309ff6dc at some t1\n2b6e3160-c482-11e1-addf-20cf309ff6dc at some t2 with t2 > t1\nRun 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是不正确的。
当前TimeUUID的文本显示分割如下:
\n\ntime_low \xe2\x80\x93 time_mid \xe2\x80\x93 time_high_and_version \xe2\x80\x93 variant_and_sequence \xe2\x80\x93 node\nRun Code Online (Sandbox Code Playgroud)\n\n如果我们从 time_high_and_version 开始重新排序,我们就可以按字典顺序对其进行排序:
\n\ntime_high_and_version \xe2\x80\x93 time_mid \xe2\x80\x93 time_low \xe2\x80\x93 variant_and_sequence \xe2\x80\x93 node\nRun Code Online (Sandbox Code Playgroud)\n\n实用程序类如下:
\n\npublic 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 }\nRun Code Online (Sandbox Code Playgroud)\n\nTimeUUID 变为:
\n\npublic 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 }\nRun Code Online (Sandbox Code Playgroud)\n\n现在我们得到:
\n\n"11e1-c481-8e4cab00-983b-20cf309ff6dc".compareTo("11e1-c482-2b6e3160-addf-20cf309ff6dc") = -1\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
5166 次 |
| 最近记录: |