2015-02-23 23 views
1

对我的问题的后续行动:Unique Linux filename, sortable by time产生以字母数字排序的UUID的一段时间

我需要生成一个UUID是本身随着时间的推移以字母数字顺序。我假设我需要追加自纪元和纳秒以来的系统日期秒数。这意味着我真的只需要一个UUID算法,该算法在给定的纳秒内以字母数字顺序排列。

因此,举例来说,我在想的UUID的是这样的:

SECONDS_SINCE_EPOCHNANOSECONDSUID

以下的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算法的承诺都是唯一的,而不是“字母数字序列性”。

可以保证唯一性和字母数字顺序的方法的任何想法?因为我们正在处理大型企业系统,所以我需要尽可能保持我的要求,但我可能会摇摆一些旧版本的Python,以及如果纯粹的bash中的解决方案不可用。

+0

这里是否涉及任何并发?如果同一纳秒内的两个文件不具有与其相对创建时间相对应的排序顺序,那么它有多重要? – 2015-02-23 19:25:04

+0

我喜欢认为它并不重要....但是有并发性,而且我们总是按照在系统上处理它们的特定顺序排列事件(我们正在处理企业数据复制和审计)。在实践中,我们在这里碰撞的可能性有多大?我会说不太可能...可能。但是,如果有任何可用的解决方案,我愿意实施它,而不是让可能性开放。 – slumtrimpet 2015-02-23 19:33:13

+0

我以为我有一个解决方案,只是为了实现在UUID中首先使用RFC 4122 UUID的时间部分和* low *的一半,所以前4个八位组快速重复,使整个UUID概念不按字典顺序排列。 – 2015-02-23 19:53:04

回答

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 

裸记住,没有保证。给予足够的尝试和足够的时间,就会发生碰撞。如果可能的话,你可能希望做一些理智的书检查进一步下面的过程链,可以纠正任何这样的错误之前,数据输入到永久记录。

+0

显然'剪切'不会列出它们列出的顺序列出的字段。我必须使用'awk'来代替它:'uuidgen -t | awk -F-'{OFS =“ - ”;打印$ 3,$ 2,$ 1,$ 4,$ 5}''。 – Dave 2017-02-22 07:27:18