在我的应用程序中,我让 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 个字符...,在给定的时间段内,发生冲突的概率是多少?
发生冲突的概率为high。进程ID可能在整个期间保持不变,而另一个数字只是一个递增的数字,在4095个订单后会重复。但是,如果进程循环,那么您也有可能与旧订单等发生冲突。如果您正在谈论多个数据库客户端,则机会也会增加。我只是不会尝试削减这个数字。那些不满意的顾客尝试下订单是不值得的。
当有多个数据库客户端生成时,即使时间戳和随机种子值也是不够的ObjectIds
。当您开始查看各个部分时,尤其是在数据库客户端场的上下文中,您应该明白为什么这些部分在那里,以及为什么删除它们可能会导致系统崩溃ObjectId
一代。
我建议您实现一种算法来创建唯一的编号并将其存储在数据库中。这很简单。它确实会影响性能一点,但它是安全的。
I wrote this https://stackoverflow.com/a/19031308/95190不久前回答了有关使用的挑战ObjectId
在一个网址中。它包含一个链接,介绍如何使用 MongoDB 创建唯一的自动递增数字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)