【发布时间】:2011-04-04 10:37:22
【问题描述】:
我想生成一个唯一的 ID,该 ID 将在 URL 中用于标识特定资源。原则上它与 pastebin.com 等相同。
id 和资源不是很秘密,但我希望它是这样你就不能减少一个 id 然后获取另一个用户资源。我正在考虑一个CHAR(8),它在 URL 中看起来不错,并且仍然足够大以减少猜测的机会。但是我如何生成这个?对于 INT,您可以使用 auto_increment 和 primary key 来确保唯一性。
但如果我按顺序执行以下操作
- 在我的应用程序中生成
CHAR(8) - 确保此 ID 不存在。
- 如果不存在,则存储,否则转到 1。
我必须将 2. 和 3. 包装在原子事务中。
但是有更好的方法吗?或者我不应该关心检查(2.),因为冲突不会经常发生。如果有帮助,我会使用 MySql 和 .Net (C#)。是否有可能以某种方式“加密”一个自动递增的 int 作为 text-id 并以精确的 8(或 10)个字符再次解密。
我已经阅读了有用的Need a smaller alternative to GUID for DB ID but still unique and random for URL,但是 MySql 不支持使用 GUID(据我所知)。但也欢迎对线程中LongToShortCode 方法的质量发表评论。
注意:资源不能更改,只能查看。
最好的问候, 拉斯
【问题讨论】:
-
不清楚您是尝试在 C# 中还是直接在 mysql 中生成此 id。为避免重复的可能性,您可以将数据库行 id 附加到唯一字符串,以便没有 2 是相同的......但它仍然无法仅减少 id 以获取上一个条目。
-
@GrandmasterB 在哪里生成 ID 并不重要,但我更希望它尽可能靠近数据库生成。 “您可以将数据库行 ID 附加到唯一字符串” - 您能更深入地解释您的意思吗?
-
如果你有一个随机 id,ABCDEFG,并且想确保它在数据库中是唯一的,添加唯一的行 id,1234-ABCDEFG,其中 1234 是行 id。然后,您不必担心碰撞。但是,它会要求您在创建行之后将随机 ID 添加到数据库中,以便您可以获得所述 ID。或者,您可以将其作为 1234-ABCDEFG 输出给用户,即使在数据库中其第 1234 行的值 ABCDEFG - 只需在查询前将其拆分为“-”即可。
-
@GrandmasterB 我想再次访问资源会出现问题。可能有许多行具有相同的结尾文本 ID。
-
如果唯一的行 ID 作为文本 ID 的一部分附加到它,则不会。
标签: c# mysql random auto-increment