如何为在线资源生成唯一的文本ID

时间:2010-08-26 18:25:44

标签: c# mysql random auto-increment

我想生成一个唯一的ID,它将在URL中用于标识特定资源。原则上它与pastebin.com等相同。

id和资源不是很秘密,但我希望它是这样你就是不能减少id然后获得另一个用户资源。我想的是一个CHAR(8),它在URL中看起来不错,但仍然足够大,可以减少猜测的机会。但是我该如何生成呢?对于INT,您可以使用auto_incrementprimary key来确保唯一性。

但如果按顺序执行以下操作

  1. 在我的应用程序中生成CHAR(8)
  2. 确保此ID不存在。
  3. 如果不存在,请存储,否则转到1。
  4. 我必须在原子事务中包装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方法的质量的评论也将受到赞赏。

    注意:资源无法更改,只能查看。

    祝你好运, 拉塞

4 个答案:

答案 0 :(得分:1)

MySql实现UUID。这似乎是具有不同名称的GUID。所以这个选项仍然适用于你。

如果您仍然要使用char(8),那么您需要担心ID的唯一性,因为如果您查看提供的网址,您可能不知道在人们开始之前发生了违规行为报告问题。

答案 1 :(得分:1)

你可以使用一个int身份,然后在使用它之前对其进行加密/解密,但在重负载下可能不是最好的想法。

答案 2 :(得分:0)

以原子方式伪造的简单方法是

  1. 生成随机字符串
  2. 存储字符串(实际上是保留它)
  3. 检查是否存在另一个
  4. 如果存在另一个,请删除您刚制作的那个,然后返回步骤1
  5. 碰撞仍然可能发生,但是当他们这样做时会导致两个线程再次尝试,在这种情况下这不是问题。

    编辑:我建议将加密哈希的前几个字符或某些东西用于生成函数,但这并不重要。

答案 3 :(得分:0)

我想我会这样做: 8个字符的文本ID可以存储最多64 ^ 8 = 2 ^ 48的数字。

然后我将使用两列:

  • ID,INT 2 ^ 32自动增量
  • Rand,INT 2 ^ 16

然后,当我添加一行时,我将生成一个随机的2 ^ 16整数并将其放入一个新行。然后简单地从组合的两个数字生成文本id。检索很简单 - 只需将其拆分并在数据库中进行简单查找即可。荒谬的简单解决方案应该消除行冲突并且足够随机(2 ^ 16)以减少猜测。

对此方法的反馈意见表示赞赏。