2016-05-21 67 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