随着时间的推移生成按字母数字排序的UUID

时间:2015-02-23 19:19:50

标签: python bash uuid

跟进我的问题:Unique Linux filename, sortable by time

我需要生成一个UUID,它本身是按字母顺序排列的。我假设我需要在纪元和纳秒之后附加系统日期秒。这意味着我真的只需要一个在给定纳秒内按字母数字顺序排列的UUID算法。

所以,例如,我想到了uuid的东西:

SECONDS_SINCE_EPOCH 即可。的纳秒即可。的 UID

以下bash:

for i in `seq 1 10`;
do
  echo `date '+%s.%N'`.`uuidgen -t`
done

结果:

1424718695.481439000.c8fef5d4-bb8f-11e4-92c7-00215e673861
1424718695.484130000.c8ff5eb6-bb8f-11e4-ae12-00215e673861
1424718695.486718000.c8ffc2ca-bb8f-11e4-ae15-00215e673861
1424718695.489267000.c90025bc-bb8f-11e4-a624-00215e673861
1424718695.491803000.c90089f8-bb8f-11e4-95ac-00215e673861
1424718695.494381000.c900ed76-bb8f-11e4-9058-00215e673861
1424718695.496899000.c901513a-bb8f-11e4-8018-00215e673861
1424718695.499460000.c901b440-bb8f-11e4-b382-00215e673861
1424718695.502007000.c90217a0-bb8f-11e4-89cd-00215e673861
1424718695.504532000.c90279d4-bb8f-11e4-b515-00215e673861

这些文件名看起来好像已经足够......但我担心的是我不能保证名称将按照数字顺序排列如果两个文件是在相同的纳秒内创建的(想想大规模的话)具有10个并发运行许多并发用户的核心的企业系统。因为在那一点上,我完全依赖于UUID算法来获取我的唯一名称,并且所有UUID算法承诺都是唯一性,而不是"字母 - 数字 - 顺序 - "。

任何可以保证唯一性和字母数字顺序的方法的想法?因为我们正在处理大型企业系统,所以我需要尽可能保持我的老式学校的要求,但如果纯粹的bash解决方案不容易获得,我可能会推出一些旧版本的Python。

1 个答案:

答案 0 :(得分:1)

基于another answer,您可以重新排序UUID的时间部分,以便最重要的值首先显示,最低显示为最不重要。这是更“自然”的方式,例如,UNIX时间被呈现并产生您正在寻找的排序顺序。

所以关注BASH应该在你的情况下做到这一点:

for i in `seq 1 10`; do
    echo $(date '+%s.%N').$(uuidgen -t | cut -d- -f3,2,1,4,5)
done

请记住,没有任何保证。如果有足够的尝试和足够的时间,就会发生碰撞。如果可能的话,您可能希望在流程链中进一步检查一些完整性检查,以便在数据输入永久记录之前纠正任何此类错误。