我的印象是,UUID规范需要一个有保证的、真实的、全球唯一的结果,不是99.999999999999%的唯一结果,而是100%的唯一结果。从规格来看:
UUID为128位长,可以保证跨空间和时间的唯一性。
看起来java只支持UUID规范的V3和V4。V4并不是真正独特的。对于使用< code > namuuidfrombytes 的V3实现,下面的结果是重复的,因为计算机太快了(编辑:循环到10并调用< code>new Date()。getTime()会产生重复项,因为计算机循环速度比< code>new Date()快。getTime()可以在每次迭代中产生不同的值):
String seed;
for (int i = 0; i < 10; i++) {
seed = "<hostname>" + new Date().getTime();
System.out.println(java.util.UUID.nameUUIDFromBytes(seed.getBytes()));
}
我是否错误地假设一个UUID是100%唯一的,它只是实际上唯一的,但不是完全唯一的?Java有没有办法做到这一点?
正如其他人所指出的,<code>UUID返回的类型4 UUID。randomUUID()对于任何实际应用程序都可能足够独特。不太可能是病态的情况:例如,在不重新启动Java进程的情况下,将VM回滚到实时快照,从而使随机数生成器返回到之前的状态。
相比之下,第3类或第5类UUID的唯一性仅与您输入的UUID相同。
在某些约束条件下,类型1 UUID(基于时间)应该稍微“更”独特。Java平台不支持生成类型1 UUID,但我已经编写了代码(可能尚未发布),通过JNI调用UUID生成库。这是18行C语言和11行Java语言。
因为你的熵仅限于你的记忆,你永远无法确保一个UUID是“有保证的、真实的、全局唯一的结果”。然而,99.99999999999%已经相当不错了。
如果要确保数据库中的唯一值,可以使用递增的简单整数以确保它是唯一的。如果你想使用UUID并真正确定它们是唯一的,你只需要在创建时检查它。如果有重复项,只需创建另一个,直到它是唯一的。
重复可能会发生,但IIRC,其中一部分是根据您当前的时间创建的,因此如果您只是每5分钟创建一次,您应该是安全的。
有不同的UUID生成方法。你使用的那种行为正是它应该做的。您正在使用nameUUIDFromBytes
,这是一个“基于指定字节数组检索类型3(基于名称)UUID的静态工厂”
如果给定相同的名称,这将生成相同的 UUID。正如你所发现的,你的循环每次都传递相同的名称,所以你会得到相同的UUID。
看看Gabe的建议:使用哪个UUID版本?他建议您使用V4,正如其他人指出的那样,它对于任何现实的用例都足够好。
问题内容: 我想用Java生成一个.torrent文件,但是我不想要一个大的API,它可以执行诸如抓取跟踪器,种子等操作。这仅适用于生成元数据的客户端。存在哪些轻量级解决方案?我只生成一个.zip文件的.torrent。 谢谢! 问题答案: 我整理了这段独立的Java代码,以准备一个带有单个文件的.torrent文件。 通过调用.torrent文件的名称,共享文件的名称和跟踪器URL 来创建.to
问题内容: 在Java中以至少32个字节长的String形式生成SALT值的最佳方法是什么? 问题答案:
在Java中,将SALT值生成为至少32字节长的字符串的最佳方法是什么?
问题内容: 在java中如何生成随机数? 问题答案: 在Java 1.7或更高版本中,执行此操作的标准方法如下: 请参阅相关的JavaDoc。这种方法的优点是不需要显式初始化java.util.Random实例,如果使用不当,可能会引起混乱和错误。 但是,相反,没有办法明确设置种子,因此在有用的情况下(例如测试或保存游戏状态或类似情况),很难重现结果。在这种情况下,可以使用下面显示的Java 1.
每当我看到这行代码 后面总是有一个很长的序列号..这个数字是如何产生的?如果我想随机生成这个值,我该怎么做呢?谢谢你的帮助。
问题内容: 我正在寻找可用于在运行时生成声音的Java代码-而不是现有声音文件的播放。 例如,在2毫秒的时间内生成440 Hz的锯齿波形的最佳代码是什么? 源代码赞赏! 我记得我的Commodore 128有一个简单的Sound命令,该命令以语音,频率,波形和持续时间作为参数来定义声音。在许多简单的情况下(快速而肮脏的游戏,声音实验等),效果都很好。 我正在专门寻找声音效果,例如声音,而不是音乐或