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

2023-12-21

在我的应用程序中,我让 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 个字符...,在给定的时间段内,发生冲突的概率是多少?

  • 进程号
  • counter

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

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

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

I wrote this https://stackoverflow.com/a/19031308/95190不久前回答了有关使用的挑战ObjectId在一个网址中。它包含一个链接,介绍如何使用 MongoDB 创建唯一的自动递增数字。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

objectid 的 mongodb 部分最有可能是唯一的 的相关文章

随机推荐

  • 如何从Java列表中获取Scala列表?

    我有一个 Java API 它返回一个列表 例如 public List
  • 如何使 jQuery UI 滑块捕捉到预定义值?

    我在 jQuery UI 中有一个滑块 其中有一些用户可以选择的预定义值 然而 现在 它只是从 1 到 60 而不是使用我的值 我有以下号码 1 3 5 15 30 60 这是我的代码 document ready function var
  • ListenAndServeTLS 在本地运行 - x509:由 docker 中的未知机构签名的证书

    我在用mkcert https github com FiloSottile mkcert生成自签名证书和授权 当我在本地使用这些文件时ListenAndServeTLS 我可以成功连接cURL 我的主机操作系统是 MacOS 但是 当尝试
  • PHP 中的正则表达式帮助(8 个十六进制字符后跟下划线)

    我想验证我的输入是否以 8 个十六进制字符开头 后跟下划线 后跟任意数量的具有任意值的字符 我目前使用以下正则表达式 preg match 0 9A Fa f 8 value 但这个表达式不能满足我的需求 因为它的行为如下 Result 1
  • 在 Mac OS X Lion 上启用 Xdebug

    我一直在尝试为 Mac OS X Lion 启用 Xdebug 但无法使其工作 这应该是非常简单的 但它对我来说不起作用 这些是我采取的步骤 1 取消注释 php ini 文件的这一行 zend extension usr lib php
  • 在 Airflow 2.0 中运行多个 Athena 查询

    我正在尝试创建一个 DAG 其中一项任务执行athena查询使用boto3 它适用于一个查询 但是当我尝试运行多个 athena 查询时 我遇到了问题 这个问题可以通过以下方式解决 如果一个人经过this https www ilkkape
  • gcc 用于解析代码

    我想知道如何使用 GCC 作为库来解析我的程序的 C C Java Objective C Ada 代码 我想绕过预处理并为用户编写的所有函数添加前缀 My 像这样Print 变成MyPrint 我也希望用变量来做到这一点 你可以看这里 h
  • 如何使用 GraphicsMagick Nodejs 将一种颜色替换为另一种颜色

    我有一张黑色背景的图像 我想将其更改为白色背景 在 Nodejs 中使用 GraphicsMagick 可以实现吗 我试过gm test png fill white 但这对我不起作用 我做了一些搜索 发现有一个转换命令 但不确定是否有等效
  • 使用 JavaScript 对象更改 element.style

    首先 这个问题有很多重复 但这些答案并没有给出更深入的见解 Q1 为什么结果是 200 0 考虑这个片段 var el document querySelector r console log First el offsetHeight e
  • 使用 python API 将视频上传到 Youtube 并将其设置为不公开

    我正在使用python 客户端库 http code google com p gdata python client 将视频上传到 youtube 我需要将其隐私设置为不公开 但是API page http code google com
  • 发送 JSON 数组 RETROFIT 2 (Android)

    我是新手 知道这个问题有很多帖子 但我找不到答案 因此 我需要使用 Retrofit2 和请求 PATCH 来升级用户及其议程 但是 我不知道如何使用 Retrofit2 做到这一点 即使我的研究 没有任何作用 你能帮我吗 谢谢提前 D 这
  • 以编程方式创建饼图[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 如何以编程方式从 java 生成饼图 我有一些由程序处理的数据 然后我想创建一个包含饼图的图像文件 P
  • 超时已过期。从池中获取连接之前超时时间已过。 。例外

    出现异常 超时已过 从池中获取连接之前超时时间已过 发生这种情况的原因可能是所有池连接都在使用中并且已达到最大池大小 code HotelDealsDataClassesDataContext hotelDealsDataContext D
  • 如何添加多个悬停工具而不在工具栏中显示多个图标?

    遵循示例here https github com bokeh bokeh blob 16e87ed63ca1aecaa42e93293f32d936685dcd3e sphinx source docs user guide exampl
  • 如何在 Flutter/Dart 中请求短信权限?

    我在用着权限处理程序 https pub dev packages permission handler请求视频和音频 但我无法让它请求发送短信的权限 我不知道这是否是我手机设置 我手机 摩托罗拉 Moto X4 XT1900 1 我手机操
  • 在 Ruby 中列出 attr_accessor 的最快/单行方法?

    列出定义的所有方法的最短的单行方法是什么attr accessor 如果我有课的话我想做到这一点MyBaseClass 任何扩展它的东西 我都可以得到attr accessor是在子类中定义的 像这样的事情 class MyBaseClas
  • 在 Grails 中翻译 HTML 选择元素

    认为这会更容易 想象一下
  • 插入/拔出耳机时 SKAudioNode() 崩溃

    我正在使用一个SKAudioNode 在我的游戏中播放背景音乐 我有播放 暂停功能 在插入耳机之前一切正常 根本没有声音 当我调用暂停 播放函数时 出现此错误 AVAudioPlayerNode mm 333 开始 所需条件为假 engin
  • Xcode:无法获取进程的任务

    我已经在使用 Xcode 4 的 iPhone 上以发布模式运行了我的应用程序 一切都很顺利 直到我切换到模拟器并切换回 iPhone 切换回来后 该应用程序在 iPhone 上启动 但主屏幕立即显示 在 Xcode 中我得到 failed
  • objectid 的 mongodb 部分最有可能是唯一的

    在我的应用程序中 我让 mongo 通过其 ObjectId 方法生成订单 id 但在用户测试中 我们担心订单 ID 会让人感到 恐吓 即如果您需要通过电话与某人讨论您的订单 那么读出 24 个字母数字字符有点乏味 同时 我真的不想存储两个