在Java中创建GUID的一些最佳方法是什么?


当前回答

java.util.UUID.randomUUID();

其他回答

用一个例子来扩展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() );
    }
}

java.util.UUID.randomUUID();

在许多情况下,我们需要对象的全局UUID,特别是在事件驱动架构或事件源中,我们必须根据日期对事件进行排序,但我们不需要关于时间戳的完整信息。

在那里,我们可以使用ULID的一个实现,它是按字典顺序排序的。

格式与标准UUID不同,但仍然很简单:

example value: 01AN4Z07BY79KA1307SR9X4MV3

 01AN4Z07BY      79KA1307SR9X4MV3

|----------|    |----------------|
 Timestamp          Randomness
   48bits             80bits

在许多语言中都有实现。

例如,在Java中,有一个简单的库。

代码示例:

import de.huxhorn.sulky.ulid.ULID;

ULID ulid = new ULID();

// with current timestamp
String newId = ulid.nextULID(); 

// with selected timestamp
String newId2 = ulid.nextULID(Instant
    .parse("2021-12-01T00:00:00.00Z")
    .toEpochMilli()
); 

使用Spring,您还可以为ULID生成器创建Bean。

@Configuration
public class UUIDGeneratorConfig {

    @Bean
    public ULID ulidGenerator() {
        return new ULID();
    }
}
@Component
public class ULIDGenerator {

    private final ULID ulid;

    public ULIDGenerator(ULID ulid) {
        this.ulid = ulid;
    }

    public String generateUUID() {
        return ulid.nextULID();
    }

    public String generateUUID(Instant timestamp) {
        return ulid.nextULID(timestamp.toEpochMilli());
    }
}

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

例如:

如果你想要一个随机的UUID,你可以使用randomUUID方法。 如果您希望将UUID初始化为特定的值,可以使用UUID构造函数或fromString方法。

这取决于你想要什么样的UUID。

The standard Java UUID class generates Version 4 (random) UUIDs. (UPDATE - Version 3 (name) UUIDs can also be generated.) It can also handle other variants, though it cannot generate them. (In this case, "handle" means construct UUID instances from long, byte[] or String representations, and provide some appropriate accessors.) The Java UUID Generator (JUG) implementation purports to support "all 3 'official' types of UUID as defined by RFC-4122" ... though the RFC actually defines 4 types and mentions a 5th type.

关于UUID类型和变体的更多信息,维基百科中有一个很好的总结,RFC 4122和其他规范中有详细的信息。