gpt4 book ai didi

algorithm - 如何在具有许多活跃用户的 Firebase 数据库中创建自定义短唯一 ID

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:48:05 25 4
gpt4 key购买 nike

我的应用程序是一个游戏,我需要每个用户能够创建一个唯一的自然数 ID 代码,该代码可以像 url-shortener 的工作方式一样双射转换为“短字符串”。 “短字符串”部分对游戏非常重要。

我想创建一个子节点,它有一个存储自然数索引和短字符串的自动 ID 键,以及另一个包含自然数作为键和前一个自动 ID 键的子节点。

我担心在两个用户同时创建新 ID 的不太可能发生的情况下会出现竞争条件。理想情况下,我希望能够从 1000 开始递增 ID,以保持短字符串非常短。

有人知道使用 firebase-database 解决此类问题的好方法吗?

我想将“短字符串”的长度保持在 6 个字符以下,并且只使用数字、大写字母和连字符。 (所以一个 34 个字符的字母表,为清楚起见省略了 1、ls、Os 和 0)

也许这是不可能的,我将不得不使用 50 个字符的字母表来生成一个随机数并将其添加到每个 key 。


一个想法是检查当前最高 key 并生成一个随机数以添加到该 key ,但仍然不能保证两个用户不会得到相同的数字。


到目前为止,如果两个用户试图同时生成一个新 key ,我唯一可能阻止竞争条件的另一个想法是保留在线用户的内部列表,并在每个用户的子节点中创建 key 并在发布到数据库之前有延迟....要求用户检查所有其他用户请求的 key 。

最后一个想法似乎很复杂并且容易出错,每次用户重新连接时都需要代码来检查列表,以防他们上次在线时失去连接。

最佳答案

hashids 是一个将数字转换为短字符串并返回的小脚本(参见 http://hashids.org/ )。

这样您就可以简单地使用递增计数器,并将它们转换为短字符串。

我在 Firebase 中使用它时有一个中央“计数器”节点,该节点只能递增 1(使用安全规则)。客户端可以使用事务将此节点递增一个。生成的数字将保证对该客户唯一。 (请注意,如果两个客户端恰好同时触发交易,则交易 block 中的代码可以触发多次。因此您需要使用交易创建的最终编号。)

然后,该客户端的唯一编号可以与 hashids 一起使用,以创建也保证唯一的短字符串。

注意:这并没有解决用户可以猜测下一个 ID 的“问题”。如果您有用于创建字符串的 salt,则可以将短字符串转换回数字。然后可以使用 hashids 函数轻松生成下一个短字符串。因此,如果您在客户端中创建短字符串,salt 在客户端中也是已知的,因此可以被用户提取。

当然,根据您的情况,这可能不是问题。

关于algorithm - 如何在具有许多活跃用户的 Firebase 数据库中创建自定义短唯一 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40383850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com