mysql UUID()和java UUID.randomUUID()

10

我想知道是否可以安全地使用Java的UUID.randomUUID()函数代替MySQL的UUID()函数生成的IDs。

我希望在URL中与我的用户共享这些ID,但是经过几次运行后,MySQL UUID()输出非常相似:

3ae2c9c4-47df-11e1-8c2a-a46b34c02a9e
976de634-47e3-11e1-8c2a-a46b34c02a9e
530cc5c6-47e7-11e1-8c2a-a46b34c02a9e
...

我不是说它们不唯一,但UUID()的结果通常是这样的吗?我想它可能与我机器上的某个标识符有关。

Java的UUID.randomUUID()看起来更加随机:

c042437b-298a-41c4-c2b6-0f83552bdb8b
e33d8ab7-d9d3-4ffe-a592-650a125d2a93
ecb12c54-5741-45c8-8b85-1825c19a9cae
...

根据我的理解,Java方法生成的ID应该可以完美替代MySQL的UUID()。

(使用Java版本的另一个好处是,当我需要在回复客户端时提供使用UUID()插入的记录时,我不必重新获取它)

谢谢

1个回答

9
你正在使用Linux还是FreeBSD?从MySQL的文档中得知:
第五个数字是IEEE 802节点号,用于提供空间唯一性。如果后者不可用(例如,主机计算机没有以太网卡,或者我们不知道如何在操作系统上找到接口的硬件地址),则使用随机数进行替换。在这种情况下,无法保证空间唯一性。尽管如此,碰撞的概率应该非常低。
当前,仅在FreeBSD和Linux上考虑接口的MAC地址。在其他操作系统上,MySQL会使用生成的随机48位数字。
还要注意:
警告: 尽管UUID()值旨在是唯一的,但它们未必是不可猜测或不可预测的。如果需要不可预测性,则应以其他方式生成UUID值。
编辑
如果您希望用户ID看起来更随机,可以通过哈希函数(如MD5(UUID()))进行处理,这会生成一个更具说服力的随机字符串。

1
我使用的是Mac电脑,但最终这个程序将在Windows机器上运行。对于我来说,可猜测性并不是问题,因为我通过mysql UUID()看到了一些模式,我猜我的用户只会认为有些地方“奇怪”。实际上也就仅此而已,但如果使用Java方法生成UUID并在插入时提前获取UUID,则会更加方便。谢谢。 - user291701

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接