Firebase推送唯一范围

Firebase推送唯一范围,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,文档说Firebase push生成了一个唯一的密钥,我想知道这个密钥在我的整个数据库(甚至是GuId)中是唯一的,还是仅在它被推送的节点中是唯一的 我正在这样构建我的数据库(根据他们的指南,我将其压平): 因此,当我获取所有用户的所有项目时,Item Key的唯一性范围对我来说很重要,它在整个数据库中是唯一的。从文件中: 使用唯一名称生成新的子位置,并返回对其的Firebase引用。当一个家庭的孩子 数据库位置表示项的集合。请参见保存列表 数据 您可以选择将一个值传递给push(),该值将 立

文档说Firebase push生成了一个唯一的密钥,我想知道这个密钥在我的整个数据库(甚至是GuId)中是唯一的,还是仅在它被推送的节点中是唯一的

我正在这样构建我的数据库(根据他们的指南,我将其压平):


因此,当我获取所有用户的所有项目时,Item Key的唯一性范围对我来说很重要,它在整个数据库中是唯一的。从文件中:

使用唯一名称生成新的子位置,并返回对其的Firebase引用。当一个家庭的孩子 数据库位置表示项的集合。请参见保存列表 数据

您可以选择将一个值传递给push(),该值将 立即写入生成的位置。如果你没有通过考试 值设置为push(),则不写入任何内容,子项将保持为空 除非使用set()写入

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


从统计上看,几乎不可能获得重复的推送ID。为了让它发生:

  • id的第一个48位片段是客户端生成的时间戳,需要在相同的毫秒内生成
  • 接下来72个随机生成的位需要相同。所以你可以有重复的推ID,但是有2^72个可能的随机排列(超过4个六分位,是世界上所有海滩上估计的沙粒数的4倍)。因此,在同一毫秒内需要大量的推送请求
  • 一位核心开发人员写了一篇博客文章,描述了它们是如何生成的:


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

    新文档说,push通过混合客户端时间和服务器时间来生成密钥,显然,客户端时间可以从多个客户端同时使用重复,如果在“服务器”上获取服务器时间的操作也同时发生在每个节点上,那么服务器时间戳实际上可能会重复得太多,时间戳以毫秒为单位,在这一年左右的时间里,我一直在使用Firebase,从来没有见过重复的密钥。再次从文档中“每次调用push()时,您的数据库都会生成一个唯一的ID,如messages/users/”,Firebase在这里通过
    push()
    生成的密钥在统计上保证是唯一的。从这个意义上讲,它们类似于guid/uuid。但除此之外,它们也是按时间顺序排列的,文档试图解释这一点。如果这让人困惑,你可以忽略这一部分,记住它们是独一无二的。
    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
            }
        }
    }