第三列中的数字确实会随着时间的推移而增加,这是一个好的开始。让我们检查连续行上数字之间的差异,看看进展是否是线性的:
#!/usr/bin/env python
import re, sys, time
lines = sys.stdin.readlines()
def parse(l): return time.mktime(map(int,l[0:6]) + [0]*3), int(l[6], 16)
stamps = [parse(re.split('[\n.: ]+',line)) for line in lines]
print lines[0][:20]
for i in xrange(1,len(stamps)):
(t1,x1) = stamps[i]
(t0,x0) = stamps[i-1]
print "%s %8d %18d %12d" % (lines[i][:20], t1-t0, x1-x0, (x1-x0)/(t1-t0))
输出:
2012.12.15 03:25:00
2013.01.01 00:50:00 1459500 1530417643520000 1048590368
2013.05.23 20:35:00 12339900 12935551254528000 1048270346
2013.05.23 21:45:00 4200 4377804800000 1042334476
2013.05.24 17:10:00 69900 73549217792000 1052206263
2013.05.25 01:10:00 28800 29955719168000 1040129137
2013.05.25 02:15:00 3900 4224712704000 1083259667
2013.05.25 17:15:00 54000 56486789120000 1046051650
2013.05.25 19:55:00 9600 10063183872000 1048248320
2013.05.25 20:30:00 2100 2455764992000 1169411900
2013.05.29 06:25:00 294900 309126496256000 1048241764
2013.05.29 06:35:00 600 394264576000 657107626
2013.05.29 06:40:00 300 401604608000 1338682026
2013.05.30 21:40:00 140400 146949537792000 1046649129
进展实际上基本上是线性的,最极端的速率对应于不确定性相对较大的最短间隔。日、月或年的变化没有明显的跳跃,因此该数字可能直接是时间单位的数量,而不是装在列中的年-月-日-时-分-秒。
速率接近纳秒,但实际上接近每秒 10.48 亿滴答。很可能右边的一些数字编码了其他东西。
值得注意的是,所有的差异都是 1000 的倍数。让我们以十进制打印出十六进制数:
9677354747411355314159639
9677354748941772957679639
9677354761877324212207639
9677354761881702017007639
9677354761955251234799639
9677354761985206953967639
9677354761989431666671639
9677354762045918455791639
9677354762055981639663639
9677354762058437404655639
9677354762367563900911639
9677354762367958165487639
9677354762368359770095639
9677354762515309307887639
639
并不显着,而且我在前面的数字中也没有看到任何模式。不过,数据似乎确实是在某个时候通过连接十进制数字构建的。
还记得接近每秒 10.48 亿的间隔吗?由于最后 3 个十进制数字可能不是时间的一部分,我们必须将这个数字除以 1000。结果非常接近每秒 2^20 个部分。所以数据看起来在某些时候是用十进制组装的,在其他时候是十六进制的!让我们将十六进制数除以 1000,但以十六进制打印出来:
for (l,s) in zip(lines, stamps): t = (s[1] - 639) / 1000; print l[:20], s[0], hex(t)
输出:
2012.12.15 03:25:00 1355538300.0 0x20c9c4695f29de6a7efL
2013.01.01 00:50:00 1356997800.0 0x20c9c469756f1e6a7efL
2013.05.23 20:35:00 1369337700.0 0x20c9c46a31abcd6a7efL
2013.05.23 21:45:00 1369341900.0 0x20c9c46a31bc1c6a7efL
2013.05.24 17:10:00 1369411800.0 0x20c9c46a32ce1a6a7efL
2013.05.25 01:10:00 1369440600.0 0x20c9c46a333db26a7efL
2013.05.25 02:15:00 1369444500.0 0x20c9c46a334d6f6a7efL
2013.05.25 17:15:00 1369498500.0 0x20c9c46a341fdd6a7efL
2013.05.25 19:55:00 1369508100.0 0x20c9c46a34455a6a7efL
2013.05.25 20:30:00 1369510200.0 0x20c9c46a344e806a7efL
2013.05.29 06:25:00 1369805100.0 0x20c9c46a38ce166a7efL
2013.05.29 06:35:00 1369805700.0 0x20c9c46a38cf8e6a7efL
2013.05.29 06:40:00 1369806000.0 0x20c9c46a38d10d6a7efL
2013.05.30 21:40:00 1369946400.0 0x20c9c46a3af47b6a7efL
那些最后 5 个十六进制数字是常数。左边的下一部分大致对应于某个纪元以来的秒数。去掉左边的一些数字应该会产生纪元,难点是知道要去掉多少个十六进制数字和要去掉多少个十进制数字。我找不到好看的时代。