- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在我的应用程序中,我让 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 个字节是时间,因此实现以干净和安全的方式删除部分时间戳的算法将具有挑战性。
机器标识符和进程标识符用于有多个服务器和/或进程充当数据库服务器客户端的情况。如果你放弃其中任何一个,你最终可能会再次重复。作为最后 3 个字节的随机值用于确保同一台机器上同一进程内的两个标识符是唯一的,即使在频繁请求时也是如此。
如果您将它用作订单 id
,并且您想要确保唯一性,我不会削减 12 字节数字的任何内容,因为它经过精心设计以提供健壮且高效的分布式当有许多连接的数据库客户端时生成唯一编号的机制。
如果取 ObjectId 的最后 5 个字符...,并且在给定的时间段内,发生冲突的概率是多少?
发生冲突的可能性高。进程 ID 可能在整个期间保持不变,而另一个数字只是一个递增的数字,会在 4095 个订单后重复。但是,如果流程循环,那么您也有可能与旧订单发生冲突等。如果您正在谈论多个数据库客户端,那么这种可能性也会增加。我只是不会尝试减少这个数字。不满意的客户试图下订单是不值得的。
当有多个数据库客户端生成 ObjectIds
时,即使是时间戳和随机种子值也不够。当您开始查看各种片段时,尤其是在数据库客户端场的上下文中,您应该明白为什么会有这些片段,以及为什么删除它们会导致 ObjectId
生成崩溃。
我建议您实现一种算法来创建唯一编号并将其存储在数据库中。这很简单。它确实会稍微影响性能,但它是安全的。
我写了this刚才回答了关于在 Url 中使用 ObjectId
的挑战。它包含一个链接,指向如何使用 MongoDB 创建唯一的自动递增数字。
关于objectid 的 mongodb 部分最有可能是唯一的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21498479/
降本手段一招鲜,增效方法吃遍天; 01 互联网行业里; 降本策略千奇百怪,手段却出奇一致;增效方法五花八门,手段更是花里胡哨; 对于企业来说;
有什么方法可以使用 angularjs 中的部分进行代码分组吗? 原因 --- 我的 Controller 包含太多代码。该 Controller 包含了多个方法和大量功能的代码,降低了代码的可读性。
不幸的是,我的数据库的数据模型必须改变,所以我正在寻找最轻松的方式来迁移我的数据。 此时情况如何: create table cargo{ id serial primary key, per
在 QTextEdit 对象中,假设我想知道字符在鼠标光标下的位置。 我会写... void MyQTextEditObject::mousePressEvent(QMouseEvent* mouse
是否可以在 C++ 中返回一个 return 语句或做一些具有类似功能的事情? 例如,如果代码中有几个函数将指针作为输入,并且每个函数都检查指针是否为 nullptr,这将很方便。如果它是一个 nul
我的 PC 上有一个控制台应用程序,它是 signalR 服务器。 我有一个 html 页面,它是互联网上的 signalR 客户端。但我尝试连接服务器,但我有一个错误的请求 400 错误。如果服务器
我想将应用程序作为后台进程运行。当点击应用程序图标时,它不会显示任何 View ,只会启动后台进程。 最佳答案 对于 iOS 这是不可能的,但是对于 android,react native 有 he
我知道有(昂贵的)框架可以让你在 VS C# 中编写 android 应用程序并将其编译为 android apk。 我也知道,可以在 VS 中编写 Java 应用程序(link)。 是否有可能,甚至
我在做: can :manage, :all if user.role == 'admin' can :approve, Anuncio do |anuncio| anuncio.try(:apr
我是一名优秀的程序员,十分优秀!