在不插入记录的情况下获取唯一标识符

4
我正在寻找一种最佳方法,基本上使用MySQL(或其他建议)获取唯一数字(保证不是某个随机字符串或当前毫秒数,并且长度合理,约为8个字符)。我只是想运行一些“SELECT ...”语句,并始终返回一个唯一的数字,而无需插入到数据库中。只需递增某个存储值并返回该值即可处理大量并发请求,而不会使应用程序受到严重阻塞。我知道可以通过使用具有更高进位数的随机数组合(长度较短)来制作某些东西,这可能使它们之间重叠的可能性非常小,但不能保证。感觉应该有一些简单的方法来做到这一点。
为澄清意思,我需要这个数字的长度很短,因为它将成为URL的一部分,并且查询可以在短时间内锁定行。我所寻找的可能是一些隐藏命令,可以执行类似于此类的操作...
LOCK VALUE
RETURN VALUE++
UNLOCK VALUE

在数据库中存储VALUE,可能是MySQL数据库。


在mysql中有一个uuid函数,它的长度超过8个字符。 - ajreal
4个回答

3

这很有趣,但对我来说太长了。 - Emil Davtyan
是的,我建议对其进行混淆。例如,取第一部分:0x6ccd780c = 1,825,404,940。请注意,这将减少随机性。 - Interrobang

1

这个唯一的数字是要与表中的特定行相关联吗?如果不是,为什么不调用rand()函数:select rand();返回值在0到1之间,因此可以根据需要进行缩放。


1

很好的问题。

最短的答案 - 根据您的规格,这根本不可能。

长的答案 - 最接近此目标的方法是MySQL的UUID,但它既不简短,也不可排序(即:一个前面的UUID值比一个后面的大/小)。

使用UUID还是不使用UUID? 是一篇描述其使用的优点和缺点的好文章,并涉及为什么您无法得到所需内容的一些原因。


嘿,太好了。这里的每个答案都值得+1,对于一个看似简单的问题来说,这是非常有信息量的帖子! - Stephane Gosselin

1

我不确定我完全理解了,也许是这样:

SELECT ROUND(RAND() * 123456789) as id

你的id会随着数字的增大而变大。

当然,不能保证唯一性,毕竟这只是一个快速的hack,你应该在代码中实现检查以处理插入重复的可能性,但也许这可以满足你的目的?

当然,还有许多其他方法可以实现这个功能。

你可以使用任何脚本语言来为你生成它,例如php:

//Generates a 32 character identifier that is extremely difficult to predict.
$id = md5(uniqid(rand(), true)); 

//Generates a 32 character identifier that is extremely difficult to predict.
$id = md5(uniqid(rand(), true)); 

然后在查询或任何需要唯一标识的地方使用$id。在我看来,使用脚本语言与数据库交互的优点是更容易验证应用程序/使用目的并相应地采取行动。例如,在您的示例中,无论使用什么方法,如果您想始终100%确保数据完整性,您必须确保其他地方没有该ID的重复项。这在脚本中比在SQL中更容易实现。

希望这可以帮助我的朋友,祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接