【问题标题】:Firebase push Id: What characters can be inside?Firebase push Id:里面可以有哪些字符?
【发布时间】:2021-12-15 05:59:36
【问题描述】:

对于我构建的应用程序,我想使用 Firebase 推送生成的 ID 作为电子邮件地址本地部分。由于dash (-) 不允许作为第一个字符,我想用另一个字符替换它。

不过,这必须是可逆的。因此我想知道,Firebase 推送 ID 由哪些字符组成? 到目前为止,我已经看到:

  • alpha(a-z 和 A-Z 和 0-9)
  • 下划线 (_)
  • 破折号 (-)

示例:-KD3rcGMuucRDjKOTK3O

  • ID 中是否可能包含其他字符?
  • firebase ID 是否总是以破折号开头?

【问题讨论】:

  • 您想要一个 KD3rcGMuucRDjKOTK3O@domain.com 的电子邮件地址?
  • 是的。一旦某人回复该电子邮件地址,我只需使用该本地部分再次在 Firebase 中查找对象
  • 您可能需要考虑其他选项,因为这听起来是个坏主意。也许有一个 push() 值作为节点名称,然后是电子邮件的孩子:test@thing.com?或者可以使用 push() 值作为参考,作为键:值对中的查找。类似 KD3rcGMuucRDjKOTK3O: test@thing.com?
  • 澄清一下,虽然总会有一个 push() 来生成一个“随机”节点名称,但该结构可能会改变。我们最近通过用户 uid 的结构来解决这个问题。它们是一种格式,然后更改为另一种格式,如果结构依赖于原始格式,则该更改会破坏您的代码。
  • 感谢您对此的澄清。我会重新考虑我的方法

标签: firebase


【解决方案1】:

可能有很多比使用 Firebase 的推送 ID 然后修改它们更好的方法来生成唯一的电子邮件地址。也就是说,如果您想了解有关 Firebase 如何生成其推送 ID 的更多信息,请阅读这篇博文:The 2^120 Ways to Ensure Unique Identifiers。它还解释了为什么您不应该依赖推送 ID 来保证不可猜测/安全。

从那篇文章中要认识到的重要一点是,推送 ID 的前 8 个字符包含一个编码时间戳,这也是如果您生成它们彼此靠近时它们总是以相同字符开头的原因。

该帖子还包含指向JavaScript code to generate a push id 要点的链接。

Firebase 从中选择的字符集是:

-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz;

如您所见,- 只是该字典中的第一个字符,这是推送 ID(当前)都以 - 开头的唯一原因。在未来的某个时候,它们将以0 开头,然后是1 等等。如果您按照要点中的代码,您可以计算出每次翻转发生的时间。

最后:我曾经写过一个关于如何从推送 id 中获取时间戳的答案。不建议这样做,但它可以是一个有趣的实验:Can you get the timestamp from a Firebase realtime database key?

【讨论】:

  • 好吧,我想我可以省去生成自己唯一 ID 的麻烦(以及由此产生的任何复杂性),而只需重新使用 firebase id。但感谢要点链接 - 错过了。所以我至少可以确定字典
【解决方案2】:

严格来说,不是对所提问题的回答,而是相关问题:根据上面@Frank 的回答,似乎始终与 Firebase 推送 ID 匹配的正则表达式看起来像这样:

const regex = /[a-zA-Z0-9-_;]*/gm;

此正则表达式假定字符串中的 ID 将由 / 分隔。添加了-; 以覆盖剩余的字符集。如果您只是在第一个匹配项之后,请删除 gm 模式标志。

我遇到了需要从 URL 中提取推送 ID 的问题。推送 ID 出现在另一个已知 ID 之后。这种情况的正则表达式可能如下所示:

let regex = new RegExp(`(?<=${known_ID}\/)[a-zA-Z0-9-_;]*`);

【讨论】:

    猜你喜欢
    • 2021-07-21
    • 2022-01-03
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    相关资源
    最近更新 更多