实践:比特币威胁,从mongodb默认key_id判断时间

1. 查看一个默认key_id :

db.t_test.findOne({"name":"cyz"})

{ "_id" : ObjectId("4df2dcec2cdcd20936a8b817"), "name" : "cyz" }

2. "4df2dcec2cdcd20936a8b817" 是一个24位的字符串,它是由ObjectId(string)所创建的一组十六进制的字符,每个字节两位的十六进制数字,总共使用了12字节的存储空间

实践:比特币威胁,从mongodb默认key_id判断时间_第1张图片

截取前4个字节,也就是前8位字符:  4df2dcec

win10打开计算器,选择程序员,上述内容粘贴到HEX(十六进制),点击DEC(十进制),复制其内容为 1307761900

3. mobaxterm 执行时间转换 :

$ tstotime 1307761900

2011-06-11T11:11:40+0800

查看上述别名定义 :

alias tstotime='func_tstotime(){ date -Iseconds -d @${1:0:10};};func_tstotime $1'

4. 实践:判断比特币威胁的时间。

查看比特币威胁信息

> show dbs;

Warning  0.000GB

local    0.000GB

mclog    2.028GB

> use Warning

switched to db Warning

> show collections;

Readme

> db.Readme.find()

{ "_id" : ObjectId("5987af2c71e24caff7bd3b4c"), "BitCoin" : "1ConGo1xRHCh3K6L1ywL4U1KHuC7XYQGqU", "eMail" : "[email protected]", "Solution" : "Your DataBase is downloaded and backed up on our secured servers. To recover your lost data:Send 0.2 BTC to our BitCoin Address and Contact us by eMail with your MongoDB server IP Address and a Proof of Payment. Any eMail without your MongoDB server IP Address and a Proof of Payment together will be ignored. You are welcome!" }

5. 十六进制 5987af2c 转换为十进制 : 1502064428

6.  判断出时间为早上8点07分。

2222 $ tstotime 1502064428

2017-08-07T08:07:08+0800

备注信息:

TimeStamp

前4位是一个unix的时间戳,是一个int类别,我们将上面的例子中的objectid的前4位进行提取“4df2dcec”,然后再将他们安装十六进制专为十进制:“1307761900”,这个数字就是一个时间戳,为了让效果更佳明显,我们将这个时间戳转换成我们习惯的时间格式

$ date -d '1970-01-01 UTC 1307761900  sec'  -u

2011年 06月 11日 星期六 03:11:40 UTC

前4个字节其实隐藏了文档创建的时间,并且时间戳处在于字符的最前面,这就意味着ObjectId大致会按照插入进行排序,这对于某些方面起到很大作用,如作为索引提高搜索效率等等。使用时间戳还有一个好处是,某些客户端驱动可以通过ObjectId解析出该记录是何时插入的,这也解答了我们平时快速连续创建多个Objectid时,会发现前几位数字很少发现变化的现实,因为使用的是当前时间,很多用户担心要对服务器进行时间同步,其实这个时间戳的真实值并不重要,只要其总不停增加就好。

Machine

接下来的三个字节,就是 2cdcd2 ,这三个字节是所在主机的唯一标识符,一般是机器主机名的散列值,这样就确保了不同主机生成不同的机器hash值,确保在分布式中不造成冲突,这也就是在同一台机器生成的objectid中间的字符串都是一模一样的原因。

pid

上面的Machine是为了确保在不同机器产生的objectid不冲突,而pid就是为了在同一台机器不同的mongodb进程产生了objectid不冲突,接下来的0936两位就是产生objectid的进程标识符。

increment

前面的九个字节是保证了一秒内不同机器不同进程生成objectid不冲突,这后面的三个字节a8b817,是一个自动增加的计数器,用来确保在同一秒内产生的objectid也不会发现冲突,允许256的3次方等于16777216条记录的唯一性。

客户端生成

mongodb产生objectid还有一个更大的优势,就是mongodb可以通过自身的服务来产生objectid,也可以通过客户端的驱动程序来产生,如果你仔细看文档你会感叹,mongodb的设计无处不在的使

用空间换时间的思想,比较objectid是轻量级,但服务端产生也必须开销时间,所以能从服务器转移到客户端驱动程序完成的就尽量的转移,必须将事务扔给客户端来完成,减低服务端的开销,另还有一点原因就是扩展应用层比扩展数据库层要变量得多。

http://www.blogjava.net/dongbule/archive/2011/06/12/352138.html

你可能感兴趣的:(实践:比特币威胁,从mongodb默认key_id判断时间)