我想生成一个唯一的ID,它将在URL中用于标识特定资源。原则上它与pastebin.com等相同。
id和资源不是很秘密,但我希望它是这样你就是不能减少id然后获得另一个用户资源。我想的是一个CHAR(8)
,它在URL中看起来不错,但仍然足够大,可以减少猜测的机会。但是我该如何生成呢?对于INT,您可以使用auto_increment
和primary key
来确保唯一性。
但如果按顺序执行以下操作
CHAR(8)
我必须在原子事务中包装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
方法的质量的评论也将受到赞赏。
注意:资源无法更改,只能查看。
祝你好运, 拉塞
答案 0 :(得分:1)
MySql实现UUID。这似乎是具有不同名称的GUID。所以这个选项仍然适用于你。
如果您仍然要使用char(8)
,那么您需要担心ID的唯一性,因为如果您查看提供的网址,您可能不知道在人们开始之前发生了违规行为报告问题。
答案 1 :(得分:1)
你可以使用一个int身份,然后在使用它之前对其进行加密/解密,但在重负载下可能不是最好的想法。
答案 2 :(得分:0)
以原子方式伪造的简单方法是
碰撞仍然可能发生,但是当他们这样做时会导致两个线程再次尝试,在这种情况下这不是问题。
编辑:我建议将加密哈希的前几个字符或某些东西用于生成函数,但这并不重要。
答案 3 :(得分:0)
我想我会这样做: 8个字符的文本ID可以存储最多64 ^ 8 = 2 ^ 48的数字。
然后我将使用两列:
然后,当我添加一行时,我将生成一个随机的2 ^ 16整数并将其放入一个新行。然后简单地从组合的两个数字生成文本id。检索很简单 - 只需将其拆分并在数据库中进行简单查找即可。荒谬的简单解决方案应该消除行冲突并且足够随机(2 ^ 16)以减少猜测。
对此方法的反馈意见表示赞赏。