问题描述
这个社区解决问题的创造力一直让我印象深刻。我很好奇我们能想出什么样的解决方案。
问题:我想使用满足以下条件的尽可能少的数字创建基于时间的 UID
(显然,会有折衷)。
- 持续时间。
ID
的唯一性保持相关的时间量。例如,YYMMDDHHmm
仅与本世纪相关,并将在January 1,2100
过时(不是我计划活那么久)。 - 分辨率。每个
"span"
的UID
。YYMMDDHHmm
只是每分钟唯一。我愿意接受99
秒作为一个合理的解决方案(也是一个方便的解决方案)。 - 可读性。时间戳的可读性如何。
YYYYMMDDHHmm
得分很高。 - 可排序性。
UID
应该可以在标准操作系统上排序。 - 让我们忽略闰年/秒。
以下是我一直在尝试的一些方法:
-
YYMMDDHHmm
(10
位数字) -
YYddddHHmm
(使用3
位儒略日期,9
位数字) -
UNIX
时间。去掉前导数字,总共9
位。这将在前导数字从2032
变为1
之前通过2
ish 工作。如此高的分辨率,但持续时间很短。您也可以删除尾随的两位数字,总共7
位,但分辨率和持续时间较低。 - 获取参考时间,然后根据经过的秒数创建 UID。对于
7
位数的价格,我可以准确计算31.7
年(丢掉最后999999999
位数后的2
秒)。这比3
的持续时间略长,但仍然不是很好,而且几乎不可读。 - 十进制时间(
8
位)。如果我将日期表示为百万分之一,则分辨率大约为半分钟。因此,YY.YYYYYY
将给出79
年的持续时间(直到2099
)和30
秒的分辨率。它的可读性不高,但足够简单。
我可以使用 hexadecimal
或 base 36
在更少的位置挤入更多的数据,但我失去了方便地对 UID 进行排序的能力,而且不美观,所以对于思想实验,我将避免这种解决方案。
直观地说,十进制时间似乎最能利用所有可用数据(因为 MM
之类的东西无法使用 13-99
的不动产)。因此,如果没有其他类型的转换或操作,这似乎是最好的答案,但我想有一些创造性的方法可以进一步减少数字的数量。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)