【问题标题】:Firebase push uniqueness scopeFirebase 推送唯一性范围
【发布时间】:2016-09-18 20:03:18
【问题描述】:

文档说 Firebase 推送会生成一个唯一的密钥,我想知道这个密钥在我的整个数据库(甚至是 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 的唯一性范围对我来说很重要

【问题讨论】:

    标签: firebase firebase-realtime-database


    【解决方案1】:

    在统计上几乎不可能获得重复的 push-Id。让它发生:

    1. id 的前 48 位片段,即客户端生成的时间戳,需要在同一毫秒内生成
    2. 接下来的 72 个随机生成的位需要相同。因此,您可能有重复的推送 ID,但有 2^72 种可能的随机排列(超过 4 六亿分,是世界上所有海滩上估计的沙粒的 4 倍)。因此,您需要在同一毫秒内发出大量推送请求。

    其中一位核心开发人员写了一篇博客文章,描述了它们是如何生成的:https://firebase.googleblog.com/2015/02/the-2120-ways-to-ensure-unique_68.html

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

    【讨论】:

      【解决方案2】:

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

      使用唯一名称生成新的子位置并返回对其的 Firebase 引用。这在一个孩子的时候很有用 数据库位置表示项目的集合。见保存列表 数据。

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

      push() 生成的唯一名称带有前缀 客户端生成的时间戳,以便生成的列表将是 按时间顺序排列。

      【讨论】:

      • 新文档说push通过混合客户端时间和服务器时间来生成密钥,显然客户端时间可以从多个客户端重复使用,如果获取服务器时间的动作在“服务器”也在每个节点上同时发生,那么服务器时间戳实际上也可能会重复firebase.google.com/docs/reference/android/com/google/firebase/…
      • 嗯,时间戳需要考虑毫秒,在我使用 Firebase 的一年左右时间里,我从未见过重复的密钥。
      • 再次来自文档“每次调用 push() 时,您的数据库都会生成一个唯一 ID,例如 messages/users//
      • firebaser here push() 生成的密钥在统计上保证是唯一的。从这个意义上说,它们类似于 GUID/UUID。但最重要的是,它们也是按时间顺序排列的,文档试图对此进行解释。如果这令人困惑,您可以忽略该部分并记住它们是独一无二的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多