理论
GUID(Globally Unique Identifier)是一个128位整数(16字节),可用于所有需要唯一标识符的计算机和网络。此标识符重复的可能性非常小。
GUID是由网卡上的标识数字(每个网卡都有唯一的标识号)以及CPU时钟的唯一数字生成的一个16字节的二进制值。
GUID的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每一个x是0-9或a-f范围内的一个十六进制的数字。
世界上的任何两台计算机都不会生成重复的GUID值(概率很小)。
GUID主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的表示符。
在Windows平台上,GUID应用非常广泛:注册表、类及接口标识、数据库、甚至自动生成的机器名、目录名等。
Time
- 时间戳。将objectid的前4位进行提取,然后按照十六进制转为十进制,这个数字就是一个时间戳。通过时间戳的转换,可以很容易看清时间格式。
Machine
- 机器码。接下来的三个字节是所在主机的唯一标识符,一般是机器主机的散列值,这样就确保了不同主机生成不同的机器hash值,确保在分布式中不造成冲突,这也就是在同一台机器生成的objectid中间的字符串都是一模一样的原因。
PID
- 进程ID。上面的Machine是为了确保在不同机器产生的objectId不冲突,而pid就是为了在同一台机器不同的mongodb进程产生了objectId不冲突,接下来的两位就是产生objectId的进程标识符。
INC
- 自增计数器。前面的九个字节是保证了一秒内不同机器不同进程生成objectId不冲突,最后面的三个字节是一个自动增加的计数器,用来确保在同一秒内产生的objectId也不会发现冲突,允许2^24等于16777216条记录的唯一性。
“Big Bang” was caused when two GUIDs collided.