Ruby UUID 和 ID 的唯一性

发布于 2024-10-22 04:12:08 字数 384 浏览 6 评论 0原文

我需要一个 6 字符字母数字 ID 在我的 Rails 应用程序中使用,它将呈现给系统用户,并且在我的系统中的所有对象实例中必须是唯一的。我预计对象实例不会超过几千个,因此 6 个字符远远超出了我的实际需要。

此时,我正在 Rails 应用程序中使用 UUIDTools gem 来生成 uuid。我应该使用哪种 UUIDTools 生成方法,以及我应该从生成的 uuid 的哪一端获取 6 个字符,以保证唯一性?

例如,如果我生成 ef1cf087-95c9-4868-bd95-cea950a52b58,我想使用前面的 ef1cf0a52b58 > 从后端?

...作为旁注/问题:我会做错吗?有更好的办法吗?

I need a 6 character alphanumeric ID for use in my rails app, which will be presented to users of the system and must be unique among all the object instances in my system. I don't expect more than a few thousand object instances, so 6 characters is far more than I really need.

At this point I'm using the UUIDTools gem in my Rails app to generate a uuid. Which of the UUIDTools generation methods should I use, and which end of the resulting uuid should I take the 6 characters from, to guarantee uniqueness?

for example, if I generate ef1cf087-95c9-4868-bd95-cea950a52b58, would I want to use ef1cf0 from the front of it, or a52b58 from the back end?

... as a side note / question: am i going about this wrong? is there a better way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

瀞厅☆埖开 2024-10-29 04:12:08

决不。 UUID 被认为是唯一的,因为它很长并且实际上不可能生成相同的 UUID。如果将其削减到 6 个字符,那么重复的可能性就会大大增加。您必须使用递增 id 或完整 UUID。

只有确定性生成(id(x + 1) = id(x) + 1)才能保证唯一性。 UUID 不能保证,而且 6 个字符的保证更差。

另一种选择是创建 ID 生成服务,它将具有单一方法 getNewId 并保留足以提供唯一 ID 的知识。 (最简单的情况——计数器)

No way. UUID is considered unique because it is very long and it is practically impossible to generate same UUIDs. If you trim it to 6 chars then you drammatically increase possiblility of duplicate. You have to use either incrementing id or full UUID.

Only deterministic generation (id(x + 1) = id(x) + 1) can guarantee uniqueness. UUID doesn't guarantee it and 6 chars guarantee it even less.

Other option is to create ID generation service, it will have single method getNewId and will keep knowledge that will be enought to provide unique ids. (Simplest case - counter)

忆依然 2024-10-29 04:12:08

当你说增加ID不是一个选项时,是因为你不希望用户看到你正在使用的方案,或者因为生成必须是无状态的(即,你无法跟踪所有ID)你已经生成了)?

如果是前者,那么您可以生成一个ID,检查是否已经使用过它,如果是,则生成另一个新ID。 (看起来很明显,如果我走错了路,那么抱歉。)您可以这样做:

while id = rand(2**256).to_s(36)[0..5] 
   break unless Ids.exists?(id)
end

其中 Ids.exists?(id) 是 does-this-already-exist 方法。

When you say that incrementing the ID isn't an option, is that because you don't want users to see the scheme you're using, or because the generation must be stateless (i.e., you can't keep track of all IDs you've generated)?

If it's the former, then you can generate an ID, check to see if you've already used it, and if so, generate another new ID. (Seems pretty obvious so sorry if I'm on the wrong track.) You could do something like this:

while id = rand(2**256).to_s(36)[0..5] 
   break unless Ids.exists?(id)
end

where Ids.exists?(id) is the does-this-already-exist method.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文