我有一个有数千行的表,这个表有一个guid列。这通常是在代码中生成的,而且工作正常。
但是,这一次执行了批处理导入,并且不包含UUID值。我现在需要更新这个表,以便它确实具有UUID值。
我遇到的问题是,当我在循环中执行以下操作时:
(select uuid())这还不够随机。这意味着在内部,机器(名称?)时间戳用于生成uuid,在tern中,UUID将导致数十万行接收超级相似的UUID。
不幸的是,我无法在软件栈中生成这种情况,所以我想知道是否有人对此有任何建议或好的解决方案。
编辑为那些接近的选票:
在数千行的(select uuid())命令中使用update时,它依赖于机器(节点)和时间戳。由于成千上万的行在彼此之间的微秒内被更新,这在所有行中产生了一个不幸的相似字符串,例如:
1a5e308e-5530-11e7-a853-932d273ec009
1a5e3160-5530-11e7-a853-932d273ec009
1a5e32a0-5530-11e7-a853-932d273ec009将是生成的前3行uuid,并应用于更新查询中的前3行。这是有问题的,因为这些UUID是在前面可见的级联字符串的大部分中使用的。正因为如此,最终的结果是,这些成为猜测,因此表示一个可能的角度的向量攻击。
我提出这个问题的目的是,是否有另一种方法来生成一个16个字符,128个字节字符串,它遵循与UUID相同的模式,但在一次迭代到下一次迭代中可能有更多的唯一性。
我希望我在这个解释上足够清楚了。
发布于 2020-02-06 09:23:22
此函数在MySQL中生成完全随机的UUID(用MySQL 5.6测试)
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的兰德()函数所能生成的那样)。
发布于 2017-06-20 05:07:12
您提到,在相邻记录中使用类似的UUID时,这是一个安全问题。下面是如何让它变得更好的方法:
SELECT MD5(UUID());或
SELECT sha1(UUID());在这种情况下没人能猜出下一个身份。如果你只需要16个字符,也许你可以做SELECT LEFT(MD5(UUID()),16)。可能会有碰撞的机会,但机会仍然非常遥远,因为MD5将提供可能的唯一输出,甚至前16个字符也会有很多组合。
https://stackoverflow.com/questions/44640866
复制相似问题