繁体   English   中英

从字符串生成的UUID是否可逆?

[英]Is a generated UUID from a String reversible?

如果我按照以下方式从“种子”字符串生成UUID,有人可以通过任何方式重新生成原始字符串吗?

UUID uuid = null;
    try {
        uuid = UUID.nameUUIDFromBytes(("seedString").getBytes("utf8"));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    System.out.println("UUID: " + uuid.toString());

我认为这是不可能的,因为我相信这个人在这里找到了: 将UUID转换为字节

但是,我看到每次从某个字符串/字节生成相同的UUID,并且由于它必须是唯一的,因此可以猜出简单的“种子”值吗? 例如,f的UUID是8fa14cdd-754f-31cc-a554-c9e71929cce7,因此,如果我知道它是从“ f”生成的,

由于您通过将字节转换为UUID来获取UUID,并且始终使用相同的起始字节进行转换,因此在多次运行中,uuid始终是相同的UUID。

我认为您已经将随机种子与UUID例程中的“从字节”方法混淆了。 它更像是强制转换,而不是种子初始化。 而且,即使就像种子初始化一样,使用恒定种子进行初始化也仅意味着您始终走“相同”的伪随机路径(意味着走了一次之后,您便可以知道下一步)。

aug也提出了一个很好的观点,我将在这里详细说明。 UUID是一个标识符,仅由于有很多可供选择的选项,它才被认为是唯一的。 但是,如果您创建的例程会重复返回相同的例程,则由于您的选择机制,它不会是唯一的。 实际的机制并不能确保唯一性。 甚至在使用保证返回相同值的例程时更是如此。

由于不能保证它们是唯一的(UUID具有固定的位数,最终所有组合都可以用完),因此可以想象输入比UUID多(尽管有很多UUID),所以UUID冲突是不可避免的(甚至如果理论上花费的时间比宇宙的热死还多)。 从实际的角度来看,您可能不必担心。 但是,它仍然可能(机会很小)发生。

这也意味着(理论上)可以保证那里的两个输入可以使用相同的UUID结束,因此,UUID通常是不可逆的(但是,在特定的(有限的)情况下,也许可以将它们制成)可逆)。

可以生成给定UUID的字符串数量不限,因此即使有人猜测您用来创建给定UUID的字符串,他们也可能永远不确定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM