如何防止 MySQL UUID V1 冲突
How to Prevent MySQL UUID V1 Collision
我们的 API 旨在为所有记录生成 MySQL 中的 UUID。
但是,所有表中生成的记录中有 99% 共享相同的 UUID 最后 3 个块。我假设这是因为 MySQL 使用基于 Mac 地址的 UUID v1,它在同一台服务器上不会改变。似乎没有足够的熵来对唯一性有高度的信心。
例如XXXXXXXX-XXXX-46fc-bb08-f9b12276ed01
这是根据维基百科验证的:
"given the speed of modern processors, successive invocations on the same machine of a naive implementation of a generator of version 1 UUIDs may produce the same UUID, violating the uniqueness property. (Non-naïve implementations can avoid this problem by, for example, remembering the most recently generated UUID, "装袋“未使用的 UUID,并使用装袋的 UUID 以防生成重复项。)”
听起来如果在一定时间内进行了足够多的 API 调用,碰撞就一定会发生(只是达到交易量的问题,例如每秒 1000 笔交易?即接近每次 1 笔交易毫秒)。
假设:UUID() 是无法更改的 MySQL 二进制函数。
我需要在多大程度上评估更改以防止冲突,以及如何将维基百科建议的 MySQL 更改为 "pocket" UUID?
对您的 UUID 列设置唯一约束。这将使数据库在插入(或更新)记录之前检查重复项,因此您可以确保 table 中没有冲突。冲突的记录将无法插入。
如果您发现由于违反该约束而导致错误 — 即如果冲突 实际上 发生在 UUID 生成器中并且数据库将它们排除在外table — 然后您可以研究更复杂的方法来生成新的 UUID,然后重试。但很有可能,你不会有任何问题。
UUID 中的时间戳字段以 100 纳秒为间隔测量,因此您必须在十分之一微秒内生成两个 UUID 才能发生冲突。这相当于每秒处理一千万笔交易的速度。一千应该没问题。
我们的 API 旨在为所有记录生成 MySQL 中的 UUID。
但是,所有表中生成的记录中有 99% 共享相同的 UUID 最后 3 个块。我假设这是因为 MySQL 使用基于 Mac 地址的 UUID v1,它在同一台服务器上不会改变。似乎没有足够的熵来对唯一性有高度的信心。
例如XXXXXXXX-XXXX-46fc-bb08-f9b12276ed01
这是根据维基百科验证的:
"given the speed of modern processors, successive invocations on the same machine of a naive implementation of a generator of version 1 UUIDs may produce the same UUID, violating the uniqueness property. (Non-naïve implementations can avoid this problem by, for example, remembering the most recently generated UUID, "装袋“未使用的 UUID,并使用装袋的 UUID 以防生成重复项。)”
听起来如果在一定时间内进行了足够多的 API 调用,碰撞就一定会发生(只是达到交易量的问题,例如每秒 1000 笔交易?即接近每次 1 笔交易毫秒)。
假设:UUID() 是无法更改的 MySQL 二进制函数。
我需要在多大程度上评估更改以防止冲突,以及如何将维基百科建议的 MySQL 更改为 "pocket" UUID?
对您的 UUID 列设置唯一约束。这将使数据库在插入(或更新)记录之前检查重复项,因此您可以确保 table 中没有冲突。冲突的记录将无法插入。
如果您发现由于违反该约束而导致错误 — 即如果冲突 实际上 发生在 UUID 生成器中并且数据库将它们排除在外table — 然后您可以研究更复杂的方法来生成新的 UUID,然后重试。但很有可能,你不会有任何问题。
UUID 中的时间戳字段以 100 纳秒为间隔测量,因此您必须在十分之一微秒内生成两个 UUID 才能发生冲突。这相当于每秒处理一千万笔交易的速度。一千应该没问题。