用Java创建GUID


Answers:


346

看一下与Java 5及更高版本捆绑在一起的UUID类

例如:


7
如果您提供一个像Kaleb Brasee这样的例子,那么您的好答案将会更好。
Zero3'1

至少可在AndroidStudio 2.3和21级及更高版本的API上运行。也许再往回走。
raddevus

5
TL; DR ...“ UUID uuid = UUID.randomUUID();”
Aviram Fireberger

419

java.util.UUID.randomUUID();


2
它可以返回重复吗?因为Guid永远不会重复
天使

3
@angel是的,从理论上讲,该UUID.randomUUID方法有可能返回重复项,但这根本不是现实问题。Oracle / OpenJDK实现使用加密强度高的随机数生成器。鉴于此,并且考虑到UUID中这么多位给出的天文范围,您可以在应用程序中生成数百万个这样的值,并且仍然可以保持良好的睡眠状态。由于使用“空间和时间”,[1] MAC地址或名称以及[2]当前日期时间作为约束,因此使用其他变体中的一个可以进一步减少冲突的可能性,甚至更接近于零。
罗勒·布尔克

@RenniePet嗯,如果您很偏执,并且在创建新ID时可以访问已使用的ID列表,则只需在中生成一个新ID,while直到获得不在列表中的ID即可:p
Nyerguds '16

1
Oracle密码随机数生成器通常是带有随机种子的PRNG。通常使用OS提供的“熵”源获得随机种子。如果您可以降级或损害该来源,则增加了加密随机数生成器生成相同数字的可能性。还值得注意的是,在某些(例如虚拟化)平台上,操作系统可能会耗尽熵。有“狡猾的骇客”可以解决此问题,但是它们会降低熵的质量。
斯蒂芬·C

这不仅是学术问题。我已经看到(未经验证的!!)声称有人确实遇到了基于随机的UUID不唯一的问题。
斯蒂芬·C

31

这取决于您想要哪种UUID

  • 标准Java UUID类生成版本4(随机)的UUID。(更新 - 版本3(名称)UUID也可以生成。)它也可以处理其他变体,尽管它不能生成它们。(在这种情况下,“句柄”表示构造UUID从实例longbyte[]String表示,以及提供一些适当的存取器。)

  • Java的UUID生成器(士) “所界定的所有3‘官方’类型UUID的实施声称支持RFC-4122 ” ......尽管RFC实际上定义了4种类型,并提到第5类型。

有关UUID类型和变体的更多信息,请参阅Wikipedia中的摘要,详细内容请参见RFC 4122。和其他规范。


1
并非完全正确,它还可以使用UUID.nameUUIDFromBytes(byte[] name)
DennisK

我站得住了。我依赖于Javadoc描述,该描述为“静态工厂根据指定的字节数组检索类型3(基于名称)的UUID。”
Stephen C

我认为该帖子不准确。该UUID Java文档说明的构造产生2型变体,不是随机的。对于3型使用public static UUID nameUUIDFromBytes(byte[] name)。用于4型public static UUID randomUUID()。JDK类不提供类型1。
slartibartfast

不,我认为我说得很对。javadocs声明:“尽管构造函数允许创建UUID的任何变体(如下所述)。” 下面列出了4个变体,包括类型1。确实,请阅读clockSequence()
Stephen C

27

仅以一个例子扩展Mark Byers的答案:

import java.util.UUID;

public class RandomStringUUID {
    public static void main(String[] args) {
        UUID uuid = UUID.randomUUID();
        System.out.println("UUID=" + uuid.toString() );
    }
}

6

其他的答案是正确的,尤其是这一个斯蒂芬·Ç

深入Java

在Java中生成UUID值仅限于版本4(随机)安全考虑,。

如果要使用其他版本的UUID,一种途径是让Java应用程序到达JVM之外,以通过调用以下命令来生成UUID:

  • 命令行实用程序
    几乎与每个操作系统捆绑在一起。
    例如,uuidgen在Mac OS X,BSD和Linux中可以找到。
  • 数据库服务器
    使用JDBC检索在数据库服务器上生成的UUID。
    例如,该uuid-ossp扩展通常与Postgres捆绑在一起。该扩展可以生成版本1、3和4的值,以及其他几个变体:
    • uuid_generate_v1mc() –生成版本1 UUID,但使用随机多播MAC地址而不是计算机的实际MAC地址。
    • uuid_generate_v5(namespace uuid, name text) –生成版本5 UUID,该版本与版本3 UUID相似,只是SHA-1被用作哈希方法。
  • Web服务
    例如,UUID Generator创建版本1和3以及nil值GUID

3
我对您的回答有一些疑问:首先,已经证明您只能从标准Ja​​va库获取V4是错误的(也可以使用V3)。其次,您听起来好像Java中除了标准库之外没有其他选项,还有手工挥霍的“因为安全方面的考虑”。最后,当有很多方法可以在Java中进行操作时(通常除非您在其中需要它,例如在创建程序集的过程中),根据外部资源开始通常效率低下(在编程和/或性能方面)。记录在SQL Server中)。
丹尼斯克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.