在Python中对UUID v1列表进行排序

1 投票
1 回答
3191 浏览
提问于 2025-04-18 01:43

如何最快速地对UUID v1列表进行排序呢?

ss = [(uuid1(), i, time.sleep(i)) for i in range(10)]

ss
[(UUID('9a5e8b20-be62-11e3-87fa-0800270bf8cf'), 0, None), (UUID('9a5e9246-be62-11e3-87fa-0800270bf8cf'), 1, None), (UUID('9af75166-be62-11e3-87fa-0800270bf8cf'), 2, None), (UUID('9c28d4ba-be62-11e3-87fa-0800270bf8cf'), 3, None), (UUID('9df31a58-be62-11e3-87fa-0800270bf8cf'), 4, None), (UUID('a056198a-be62-11e3-87fa-0800270bf8cf'), 5, None), (UUID('a351c986-be62-11e3-87fa-0800270bf8cf'), 6, None), (UUID('a6e63dc0-be62-11e3-87fa-0800270bf8cf'), 7, None), (UUID('4f418380-cfac-11e3-87fa-0800270bf8cf'), 8, None), (UUID('7de51c1e-d075-11e3-87fa-0800270bf8cf'), 9, None)]

使用下面这个语句时,结果并不总是正确:

sorted(ss, key= lambda x: x[0])

[(UUID('4f418380-cfac-11e3-87fa-0800270bf8cf'), 8, None), (UUID('7de51c1e-d075-11e3-87fa-0800270bf8cf'), 9, None), (UUID('9a5e8b20-be62-11e3-87fa-0800270bf8cf'), 0, None), (UUID('9a5e9246-be62-11e3-87fa-0800270bf8cf'), 1, None), (UUID('9af75166-be62-11e3-87fa-0800270bf8cf'), 2, None), (UUID('9c28d4ba-be62-11e3-87fa-0800270bf8cf'), 3, None), (UUID('9df31a58-be62-11e3-87fa-0800270bf8cf'), 4, None), (UUID('a056198a-be62-11e3-87fa-0800270bf8cf'), 5, None), (UUID('a351c986-be62-11e3-87fa-0800270bf8cf'), 6, None), (UUID('a6e63dc0-be62-11e3-87fa-0800270bf8cf'), 7, None)]

我期望的排序顺序是:0,1,2,3,4,5,6,7,8,9,而不是8,9,0,1,2,3,4,5,6,7

请注意,我想排序的列表里只有UUID:在上面的例子中,按x[1]排序对我来说是行不通的。

1 个回答

2

Python中的UUID是根据它的int属性进行排序的,这个属性是UUID对象唯一的一个成员。

def __cmp__(self, other):
    if isinstance(other, UUID):
        return cmp(self.int, other.int)
    return NotImplemented

这和UUID v1对象中的“时间戳”部分不同(你可以通过time属性来访问),因为它们指的是底层字节序列,顺序是不同的:

>>> x = uuid.uuid1()
>>> x
UUID('488085a8-be83-11e3-a999-1803733f0b7d')
>>> x.int
96371740624175594482388131032705469309L
>>> ((((((((((x.time_low << 16) | x.time_mid) << 16) | x.time_hi_version) << 8) | x.clock_seq_hi_variant) << 8) | x.clock_seq_low) << 48) | x.node) == x.int
True
>>> x.time
136161884817622440L
>>> (((((x.time_hi_version & 0xFFF) << 16) | x.time_mid) << 32) | x.time_low) == x.time
True

所以当你根据时间戳对UUID v1对象进行排序时,需要指定“时间”属性:

sorted(ss, key= lambda x: x[0].time)

撰写回答