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

Nic*_*adi 5 algorithm race-condition firebase firebase-realtime-database

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

我考虑过创建一个带有自动 id 键的子节点,该子节点存储自然数索引和短字符串,以及另一个包含自然数作为键和前一个自动 id 键的子节点。

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

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

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

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


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


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

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

小智 4

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

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

我在 Firebase 中通过一个中央“计数器”节点来使用它,该节点只能递增 1(使用安全规则)。客户端可以使用事务将该节点加一。所得到的号码将保证对该客户而言是唯一的。(请注意,如果两个客户端同时触发交易,则交易块中的代码可以多次触发。因此,您需要使用交易创建的最终数字。)

然后可以使用该客户端唯一的数字来hashids创建一个也保证唯一的短字符串。

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

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