2016-05-21 74 views
1

文檔說火力地堡推生成一個唯一的關鍵,我想知道,如果這個鍵是在我的整個數據庫(甚至是GUID)唯一的,或者只是在它是在火力地堡推獨特範圍

推節點

我構建我的數據庫這樣的(我變平下來,按他們的嚮導):

users { 
    -KIH-uFo_2jW16Ue8JNH { //User-Key 
     username : "Johnny Dummy" 
     gender : "male" 
    } 
} 
items { 
    -KIH-uFo_2jW16Ue8JNH { //User-Key 
     -KIH6iaw5uAS856i6-u9 : { //Item-Key 
      itemname : "Item Dummy" 
      count : 3 
     } 
    } 
} 

所以產品密鑰的唯一性作用域是對我很重要,當我取回所有用戶的所有項目

回答

4

統計上幾乎不可能得到重複的推式ID。它的出現:

  1. 第一48位片的id,由客戶端生成的時間戳,將需要在同一毫秒
  2. 下一個72個隨機產生的比特將需要是要產生一樣。因此,您可以重複推送ID,但有2^72個可能的隨機排列(超過4次sextillion,這是世界上所有海灘上估計的沙粒的4倍)。所以你需要在相同的毫秒內提供很多推送請求。

之一核心開發者寫博客文章描述它們是如何產生的:https://firebase.googleblog.com/2015/02/the-2120-ways-to-ensure-unique_68.html

「A推ID包含的信息120位的前48位是一個時間戳,這既降低的可能性碰撞,並允許連續創建的推式ID按時間順序排序,時間戳後面是72位隨機性,這可確保即使兩個人在同一毫秒內創建推式ID也不太可能產生相同的ID。如果客戶端在同一個毫秒內創建多個推送ID,爲了保持時間順序,我們只需將隨機位「增加」一個。「

2

它在整個數據庫中都是唯一的。從文檔:

使用唯一名稱生成新的子位置並返回對其的Firebase引用。當數據庫位置的孩子代表項目集合時,這非常有用。請參閱保存 數據列表。

您可以選擇將值傳遞給push(),並將該值立即寫入到生成的位置 。如果您未將 值傳遞給push(),則不會寫入任何內容,並且除非使用set()寫入,否則子節點將保持爲空 。

由push()生成的唯一名稱以 客戶端生成的時間戳爲前綴,以便生成的列表按照時間順序排序爲 。

+0

新文檔說通過混合客戶端時間和服務器時間來推送生成密鑰,客戶端時間可以從多個客戶端重複使用併發使用,而且如果在服務器上獲取服務器時間的操作同時發生在每個節點上,服務器時間戳也可能實際上重複https://firebase.google.com/docs/reference/android/com/google/firebase/database/DatabaseReference.html#public-methods – rocketspacer

+2

那麼,時間戳考慮了幾毫秒,在一年左右的時間裏,我一直在使用Firebase,我從未見過重複密鑰。 – MrBrightside

+0

再次來自文檔「每次您調用push()時,您的數據庫都會生成一個唯一的ID,如messages/users//」 – MrBrightside