Firebase推出唯一性范围

时间:2016-05-21 16:44:39

标签: firebase firebase-realtime-database

文档说Firebase push生成一个唯一的密钥,我想知道这个密钥在我的整个数据库(甚至是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
        }
    }
}

因此,当我获取所有用户的所有项目时,Item-Key的唯一性范围对我来说很重要

2 个答案:

答案 0 :(得分:6)

统计上几乎不可能获得重复的push-Ids。为了实现它:

  1. id的前48位,即客户端生成的时间戳,需要在相同的毫秒内生成
  2. 接下来的72个随机生成的比特需要相同。所以你可能有重复的推ids,但是有2 ^ 72种可能的随机排列(超过4性别,这是世界上所有海滩估计的沙粒数的4倍)。所以你需要在同一毫秒内完成很多推送请求。
  3. 其中一位核心开发人员撰写了一篇博文,介绍了如何生成它们:https://firebase.googleblog.com/2015/02/the-2120-ways-to-ensure-unique_68.html

    "推送ID包含120位信息。前48位是时间戳,它既降低了碰撞的可能性,又允许连续创建的推送ID按时间顺序排序。时间戳之后是72位随机性,这确保即使两个人在完全相同的毫秒内创建推送ID也极不可能生成相同的ID。对随机性的一个警告是,如果客户在同一毫秒内创建多个推送ID,为了保持按时间顺序排序,我们只需增加'随机比特一个。"

答案 1 :(得分:2)

它在整个数据库中都是唯一的。来自文档:

  

使用唯一名称生成新的子位置,并向其返回Firebase引用。这对一个孩子来说很有用   数据库位置表示项目的集合。请参阅保存列表   数据

     

您可以选择将值传递给push(),值将为   立即写入生成的位置。如果你没有通过   push()的值,没有写入,孩子将保持为空   除非写入使用set()。

     

push()生成的唯一名称以a为前缀   客户端生成的时间戳,以便生成结果列表   按时间顺序排序。