2014-06-22 64 views

回答

5

ObjectId是「_id」的默認類型,它使用12個字節的存儲空間,這使得它們具有24個十六進制數字的字符串表示形式:每個字節2個數字。這是在客戶端生成的。如果快速連續創建多個新的ObjectId,則可以看到每次只更改最後幾位數字。另外,ObjectId中間的幾個數字將會改變(如果你將創作空間隔開幾秒)。這是因爲創建ObjectIds的方式。

0|1|2|3  4|5|6 7|8| 9|10|11 

Timestamp machine PID Increment 

第一個四個字節的的ObjectId的是在幾秒鐘的時間戳:該12個字節的的ObjectId的生成如下。這提供了一些有用的屬性:時間戳與下五個字節組合時,以秒爲粒度提供唯一性。由於時間戳首先出現,這意味着ObjectIds將按大致插入順序進行排序(這不是一個強大的保證)。 在這四個字節中存在每個文檔創建時的隱式時間戳。

ObjectId的下三個字節是生成它的機器的唯一標識符。這通常是機器主機名的散列。通過包含這些字節,可以保證不同的機器不會產生碰撞的ObjectId。

爲了在單個機器上同時生成ObjectIds的不同進程間提供唯一性,接下來的兩個字節將從ObjectId生成進程的進程標識符(PID)中獲取。 ObjectId的前九個字節保證了它在單個機器和進程中的唯一性。最後三個字節只是一個增量計數器,它負責在一個進程中在一秒內完成唯一性。

這允許在一秒內爲每個進程生成最多256^3(16,777,216)的唯一ObjectId。

+0

wouldnt一個uuid提供更多的獨特性?使用這種算法,似乎不可能生成重複的ID ...「機器」-id來自哪裏? – wutzebaer

+2

我已經將它寫入了machineId是主機名散列的答案,請查看uuid vs objectId比較:http://stackoverflow.com/questions/22606364/collision-probability-of-objectid-vs-uuid-in一個大型分佈式系統a –