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



回答我的问题:唯一的Linux文件名,可按时间排序

我需要生成一个UUID,它本身是随着时间的推移按字母数字顺序排列的。我想我需要添加系统日期,从epoch到纳秒。这意味着我真的只需要一个UUID算法,它在给定的纳秒内是字母数字顺序的。

例如,我认为uuid类似于:

SECOND_SINCE_EPOCH 纳米级 UID

以下抨击:

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等等。

根据另一个答案,您可以对UUID的时间部分进行重新排序,使最重要的值首先显示,然后向下显示到最不重要的值。这是一种更"自然"的方式,比如说,UNIX时间是以这种方式呈现的,并产生您想要的排序顺序。

因此,下面的BASH应该在您的情况下发挥作用:

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

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

最新更新