我们的API旨在为MySQL中的所有记录生成UUID。
但是,在所有表中生成的99%的记录共享UUID的最后3个块。我假设这是因为MySQL使用UUID的v1,它基于Mac地址,在同一台服务器上不会改变。对独特性有高度的信心似乎不够熵。
e.g。 XXXXXXXX-XXXX-46fc-bb08-f9b12276ed01
这是根据维基百科验证的:
“鉴于现代处理器的速度,在同一台机器上对版本1 UUID的生成器的简单实现进行连续调用可能会产生相同的UUID,从而违反唯一性属性。(非天真的实现可以避免这个问题,例如,记住最近生成的UUID,“扒窃”未使用的UUID,并在将要生成重复的情况下使用有口袋的UUID。)“
听起来如果在一定时间内进行了足够的API调用,那么冲突将是确定的(仅仅是达到事务量的问题,例如每秒1000次事务?即每毫秒接近1次事务)。
假设:UUID()是MySQL二进制函数,无法更改。
我需要以什么体积评估更改以防止冲突?如何将维基百科推荐的MySQL更改改为“口袋”UUID?
答案 0 :(得分:1)
在UUID列上添加唯一约束。这将使数据库在插入(或更新)记录之前检查重复项,因此您可以确保表中没有冲突。碰撞记录将无法插入。
如果您发现由于违反该约束而实际上出现错误 - 即如果UUID生成器中发生了实际的冲突,并且数据库将它们排除在表外 - 那么您可以查看更复杂的方法来生成新的UUID并重试。但是很有可能,你不会有任何问题。
UUID中的时间戳字段以100纳秒的间隔进行测量,因此您必须在十分之一微秒内生成两个UUID才能发生冲突。这相当于每秒一千万笔交易的费率。一千个应该没事。