随着时间的推移生成按字母数字顺序排列的 UUID
generate alpha-numerically ordered UUID's over time
跟进我的问题:
我需要生成一个 UUID,它本身随时间按字母数字顺序排列。我假设我需要附加自纪元以来的系统日期秒数和纳秒数。这意味着我真的只需要一个在给定纳秒内按字母数字顺序排列的 UUID 算法。
例如,我在想 uuid 是这样的:
SECONDS_SINCE_EPOCH.NANOSECONDS.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 算法承诺的是唯一性,而不是 "alpha-numeric-sequential-ness".
对于可以保证唯一性和字母数字顺序的方法有什么想法吗?因为我们处理的是大型企业系统,所以我需要尽可能地保持我的要求老派,但我可能可以使用一些旧版本的 Python 以及如果纯 bash 中的解决方案不是'随时可用。
基于 another answer,您可以重新排序 UUID 的时间部分,以便首先显示最重要的值,然后向下显示最不重要的值。这是更 "natural" 的方式,比方说,UNIX 时间被呈现并产生您正在寻找的排序顺序。
所以下面的 BASH 应该可以解决你的问题:
for i in `seq 1 10`; do
echo $(date '+%s.%N').$(uuidgen -t | cut -d- -f3,2,1,4,5)
done
切记,没有任何保证。如果有足够的尝试和足够的时间,就会发生碰撞。如果可能的话,您可能希望在流程链的下游做一些健全的书籍检查,这可以在数据进入永久记录之前纠正任何此类错误。
跟进我的问题:
我需要生成一个 UUID,它本身随时间按字母数字顺序排列。我假设我需要附加自纪元以来的系统日期秒数和纳秒数。这意味着我真的只需要一个在给定纳秒内按字母数字顺序排列的 UUID 算法。
例如,我在想 uuid 是这样的:
SECONDS_SINCE_EPOCH.NANOSECONDS.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 算法承诺的是唯一性,而不是 "alpha-numeric-sequential-ness".
对于可以保证唯一性和字母数字顺序的方法有什么想法吗?因为我们处理的是大型企业系统,所以我需要尽可能地保持我的要求老派,但我可能可以使用一些旧版本的 Python 以及如果纯 bash 中的解决方案不是'随时可用。
基于 another answer,您可以重新排序 UUID 的时间部分,以便首先显示最重要的值,然后向下显示最不重要的值。这是更 "natural" 的方式,比方说,UNIX 时间被呈现并产生您正在寻找的排序顺序。
所以下面的 BASH 应该可以解决你的问题:
for i in `seq 1 10`; do
echo $(date '+%s.%N').$(uuidgen -t | cut -d- -f3,2,1,4,5)
done
切记,没有任何保证。如果有足够的尝试和足够的时间,就会发生碰撞。如果可能的话,您可能希望在流程链的下游做一些健全的书籍检查,这可以在数据进入永久记录之前纠正任何此类错误。