gpt4 book ai didi

objectid 的 mongodb 部分最有可能是唯一的

转载 作者:可可西里 更新时间:2023-11-01 09:23:16 25 4
gpt4 key购买 nike

在我的应用程序中,我让 mongo 通过其 ObjectId 方法生成订单 ID。

但在用户测试中,我们担心订单 ID 会让人感到“恐吓”,即如果您需要通过电话与某人讨论您的订单,读出 24 个字母数字字符有点乏味。

与此同时,我真的不想存储两个不同的 ID,一个是“人类可访问的”,另一个是供 mongo 内部使用的。

所以我的问题是 - 有没有办法选择长度为 6 甚至 8 的 mongo objectId 字符串的子字符串,我可以相当确定它是唯一的?

例如,如果我有一个像这样的 mongo objectid

id = '4b28dcb61083ed3c809e0416'

也许我可以拿出来

human_id = id.substr(0,7);

并确保我的订单始终获得唯一 ID...

优势当然是这些是命令,也是人为创建的,因此每毫秒不会有数百万个命令。另一方面,如果两个订单具有相同的缩短 id,那将是一个真正的问题......

--- 更清晰的解释---

我想问我的问题的更好方法是:

例如,如果我决定只使用 mongo id 的最后 6 个字符,是否有某种衡量这 6 个字符在给定周内重复出现的“概率”的方法?

给定一定数量的mongo并行运行,一周内一定数量的用户等

最佳答案

如果您有多个 Web 服务器,具有多个进程,那么确实没有任何东西可以在失去唯一性的情况下删除。

如果您查看 ObjectId 的性质:

  • 一个 4 字节的值,表示自 Unix 纪元以来的秒数,
  • 一个 3 字节的机器标识符,
  • 一个 2 字节的进程 ID,以及
  • 一个 3 字节的计数器,以随机值开头。

您会发现那里没有多少可以安全删除的内容。由于前 4 个字节是时间,因此实现以干净和安全的方式删除部分时间戳的算法将具有挑战性。

机器标识符和进程标识符用于有多个服务器和/或进程充当数据库服务器客户端的情况。如果你放弃其中任何一个,你最终可能会再次重复。作为最后 3 个字节的随机值用于确保同一台机器上同一进程内的两个标识符是唯一的,即使在频繁请求时也是如此。

如果您将它用作订单 id,并且您想要确保唯一性,我不会削减 12 字节数字的任何内容,因为它经过精心设计以提供健壮且高效的分布式当有许多连接的数据库客户端时生成唯一编号的机制。

如果取 ObjectId 的最后 5 个字符...,并且在给定的时间段内,发生冲突的概率是多少?

  • 进程号
  • 柜台

发生冲突的可能性。进程 ID 可能在整个期间保持不变,而另一个数字只是一个递增的数字,会在 4095 个订单后重复。但是,如果流程循环,那么您也有可能与旧订单发生冲突等。如果您正在谈论多个数据库客户端,那么这种可能性也会增加。我只是不会尝试减少这个数字。不满意的客户试图下订单是不值得的。

当有多个数据库客户端生成 ObjectIds 时,即使是时间戳和随机种子值也不够。当您开始查看各种片段时,尤其是在数据库客户端场的上下文中,您应该明白为什么会有这些片段,以及为什么删除它们会导致 ObjectId 生成崩溃。

我建议您实现一种算法来创建唯一编号并将其存储在数据库中。这很简单。它确实会稍微影响性能,但它是安全的。

我写了this刚才回答了关于在 Url 中使用 ObjectId 的挑战。它包含一个链接,指向如何使用 MongoDB 创建唯一的自动递增数字。

关于objectid 的 mongodb 部分最有可能是唯一的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21498479/

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