我正在寻找最好的方法来基本上获得一个唯一的数字(保证,而不是一些随机字符串或当前时间,以毫秒为单位,合理长度约8个字符)使用MySQL(或其他方式建议欢迎)。< / p>
我基本上只想运行一些SELECT ...
语句并让它始终返回一个唯一的数字而不插入任何数据库。只是增加一些存储值并返回值的东西,可以同时处理大量请求,而不会严重阻塞应用程序。
我知道我可以使用具有更高基数(更短的长度)的随机数组合来制作某些东西,这可能使它们不太可能重叠,但不能保证它。
感觉应该有一些简单的方法来获得这个。
我需要将此数字缩短,因为它将成为URL的一部分,并且查询可以在短时间内锁定行。我正在寻找的可能是一些命令,在发动机罩做这样的事情......
LOCK VALUE
RETURN VALUE++
UNLOCK VALUE
如果VALUE
存储在数据库中,则可能是MySQL数据库。
答案 0 :(得分:3)
您寻求UUID()
。
http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid
mysql> SELECT UUID();
-> '6ccd780c-baba-1026-9564-0040f4311e29'
它将返回128位十六进制数。你可以根据需要进行捣乱。
答案 1 :(得分:1)
我不确定我是否完全理解,也许是这样的:
SELECT ROUND(RAND() * 123456789) as id
你的数字越大,你的身份就越大。
当然不保证唯一性,毕竟这是一个快速的黑客攻击,你应该实现一个检查代码来处理插入重复的机会,但是这可能会达到你的目的吗?
当然,还有很多其他方法可以做到这一点。
你可以轻松地使用大多数脚本语言为你生成这个,例如:
//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
或者您需要的唯一ID。在我看来,在与数据库交互时以脚本语言执行此操作的优势在于更容易验证应用程序/使用目的并采取相应行动。例如,在您的示例中,无论您使用何种方法,如果您希望100%始终确保数据完整性,您必须确保其他地方没有该ID的重复项。这在脚本中比在SQL
中更容易。
希望能帮助我的朋友,祝你好运!
答案 2 :(得分:1)
是否将唯一编号与表格中的特定行相关联?如果没有,为什么不调用rand():select rand();
返回的值介于0和1之间,因此根据需要进行缩放。
答案 3 :(得分:1)
好问题。
最短的答案 - 根据您的规格,这根本不可能。
答案很长 - 最近的方法是MySQL's UUID
,但这既不短,也不可排序(即:以前的UUID值大于/小于前一个)。
To UUID or not to UUID?是一篇很好的文章,描述了它们的用法的优缺点,也说明了为什么你不能拥有你需要的一些原因