gpt4 book ai didi

MySQL UUID 替代品——更多的随机性

转载 作者:行者123 更新时间:2023-11-29 02:44:36 28 4
gpt4 key购买 nike

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

不过这次是批量导入,不包含UUID值。我现在需要更新此表,以便它确实具有正确的 UUID 值。

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

(select uuid())

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

不幸的是,我无法在软件堆栈中生成它,所以我想知道是否有人对此有任何提示或好的解决方案。

编辑对于那些势均力敌的投票:

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

1a5e308e-5530-11e7-a853-932d273ec009
1a5e3160-5530-11e7-a853-932d273ec009
1a5e32a0-5530-11e7-a853-932d273ec009

将是前 3 个 uuid 生成并应用于更新查询中的前 3 行。这是有问题的,因为这些 UUID 在前端可见的连接字符串的大部分中使用。因此,最终结果是这些变得可以猜测,因此代表了矢量攻击的可能角度。

我问这个问题的目的是,是否有另一种方法可以生成 16 个字符、128 字节的字符串,该字符串遵循与 UUID 相同的模式,但从一次迭代到下一个。

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

最佳答案

此函数在 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 on Wikipedia)——相反,它是完全随机的(或者更准确地说,与 MySQL 的 RAND() 函数可以生成的一样随机)

关于MySQL UUID 替代品——更多的随机性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44640866/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com