首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL UUID选择-更多的随机性

问MySQL UUID选择-更多的随机性
EN

Stack Overflow用户
提问于 2017-06-19 22:24:17
回答 2查看 2K关注 0票数 6

我有一个有数千行的表,这个表有一个guid列。这通常是在代码中生成的,而且工作正常。

但是,这一次执行了批处理导入,并且不包含UUID值。我现在需要更新这个表,以便它确实具有UUID值。

我遇到的问题是,当我在循环中执行以下操作时:

代码语言:javascript
复制
(select uuid())

这还不够随机。这意味着在内部,机器(名称?)时间戳用于生成uuid,在tern中,UUID将导致数十万行接收超级相似的UUID。

不幸的是,我无法在软件栈中生成这种情况,所以我想知道是否有人对此有任何建议或好的解决方案。

编辑为那些接近的选票:

在数千行的(select uuid())命令中使用update时,它依赖于机器(节点)和时间戳。由于成千上万的行在彼此之间的微秒内被更新,这在所有行中产生了一个不幸的相似字符串,例如:

代码语言:javascript
复制
1a5e308e-5530-11e7-a853-932d273ec009
1a5e3160-5530-11e7-a853-932d273ec009
1a5e32a0-5530-11e7-a853-932d273ec009

将是生成的前3行uuid,并应用于更新查询中的前3行。这是有问题的,因为这些UUID是在前面可见的级联字符串的大部分中使用的。正因为如此,最终的结果是,这些成为猜测,因此表示一个可能的角度的向量攻击。

我提出这个问题的目的是,是否有另一种方法来生成一个16个字符,128个字节字符串,它遵循与UUID相同的模式,但在一次迭代到下一次迭代中可能有更多的唯一性。

我希望我在这个解释上足够清楚了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-06 09:23:22

此函数在MySQL中生成完全随机的UUID(用MySQL 5.6测试)

代码语言:javascript
复制
select LOWER(CONCAT(
    LPAD(HEX(ROUND(rand()*POW(2,32))), 8, '0'), '-',
    LPAD(HEX(ROUND(rand()*POW(2,16))), 4, '0'), '-',
    LPAD(HEX(ROUND(rand()*POW(2,16))), 4, '0'), '-',
    LPAD(HEX(ROUND(rand()*POW(2,16))), 4, '0'), '-',
    LPAD(HEX(ROUND(rand()*POW(2,48))), 12, '0')
))

请注意,它不是一个UUIDv4,因为它没有指示版本4或变体的位(请参阅维基百科的UUIDv4 -相反,它是完全随机的(或者,更准确地说,就像MySQL的兰德()函数所能生成的那样)。

票数 4
EN

Stack Overflow用户

发布于 2017-06-20 05:07:12

您提到,在相邻记录中使用类似的UUID时,这是一个安全问题。下面是如何让它变得更好的方法:

代码语言:javascript
复制
SELECT MD5(UUID());

或

代码语言:javascript
复制
SELECT sha1(UUID());

在这种情况下没人能猜出下一个身份。如果你只需要16个字符,也许你可以做SELECT LEFT(MD5(UUID()),16)。可能会有碰撞的机会,但机会仍然非常遥远,因为MD5将提供可能的唯一输出,甚至前16个字符也会有很多组合。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44640866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档