如何在Python中生成供Java程序使用的长整型UUID?
如何用Python生成一个长整型(64位,供Java程序使用)的UUID?
我看过UUID模块的相关内容,所以我试着玩了一下:
>>> import uuid
>>> uuid.uuid1().int
315596929882403038588122750660996915734L
为什么在uuid.uuid1().int生成的整数后面会有一个L?如果它是一个整数,难道不应该只有数字吗?
根据文档,uuid.uuid1().int会生成一个128位的整数。我需要的是一个长整型(供Java程序使用),这意味着它需要是64位。有没有办法生成一个64位的UUID,而不是128位的?
还有一个问题,根据Python文档,Python的int是32位,而Python的long是“无限精度”。“无限精度”是什么意思?我需要一个64位的长整型,那在Python中应该用什么类型呢?
编辑:感谢大家的回复。看起来UUID的定义就是128位。在这种情况下,我可能不应该使用UUID这个词。我想做的是生成一个长整型(64位)的唯一ID。我以为UUID可以满足这个需求,但看起来不行。
我需要这个ID作为Solr搜索引擎的文档ID。我正在使用一个实时索引的Solr插件Zoie。根据文档,“Zoie假设每个要被索引的记录必须有一个唯一键,并且类型为long。”
所以,考虑到我需要这个,您知道我该如何生成一个长整型的唯一ID吗?
谢谢!
4 个回答
UUID的标准定义是128位。
我敢说,64位是不够的,无法保证每个UUID都是独一无二的。
这里的L
表示这是一个长整型的数值,也就是比32位的整数要大。
标准的UUID总是128位的;如果你只想要一个64位的值,你就需要使用UUID的一部分,或者选择其他的方式,而不是使用UUID。
根据你需要的唯一性程度,你可以生成一种自己的UUID,这种ID在一台机器上是唯一的,但不一定在所有机器上都是唯一的。
如果这个ID只需要在一个平台上是唯一的,那么你可以去掉最后的节点ID部分(最后6个字节)。
另外,你还需要考虑这些数字生成的频率。它们是每秒生成一次,还是非常频繁地生成?你可以看看这里关于UUID生成的内容,这样你就能明白我说的意思了:http://tools.ietf.org/id/draft-leach-uuids-guids-01.txt
你可能可以根据自己的情况制作一个版本,同时满足你的需求,并且轻松地控制在64位以内。
顺便提一下,“L”表示长整型,通常意味着64位长度,而不是32位。这个标记只是用来在打印数字时附加上去的。