21xrx.com
2024-09-17 03:52:29 Tuesday
登录
文章检索 我的文章 写文章
如何在Java中获取UUID?
2023-06-15 17:04:41 深夜i     --     --
Java UUID 随机数 时间戳 机器id 标识符 生成

在Java编程中,我们经常需要生成唯一的标识符,这样才能保证我们的应用程序在处理唯一数据时不会出现重复的情况。UUID是一种非常好的用于生成唯一标识符的方式,在Java中,我们可以通过使用Java标准库中的UUID类来生成UUID。接下来,我们将介绍如何在Java中获取UUID。

1.使用Java标准库中的UUID类

我们可以通过调用UUID类的静态方法randomUUID()来获取一个随机生成的UUID。例如:


import java.util.UUID;

// ...

UUID uuid = UUID.randomUUID();

System.out.println(uuid);

这会输出类似于这样的一个UUID: `3b427b3d-cd7a-4de1-b42a-e8ff4f67a8af`

2.使用第三方库

除了使用Java标准库中的UUID类之外,我们还可以使用很多第三方库来生成UUID,例如Google的Guava库和Apache的Commons库。这些库中也提供了生成UUID的方法。

3.使用时间戳和机器id生成UUID

如果我们想要生成的UUID是基于时间戳和机器id的,那么我们可以使用Java标准库中的NetworkInterface类来获取机器id。然后,我们就可以使用如下代码来生成UUID:


import java.net.NetworkInterface;

import java.security.SecureRandom;

import java.util.Enumeration;

public class UUIDGenerator {

  public static void main(String[] args) {

    System.out.println(generateRandomBasedUUID());

    System.out.println(generateTimeBasedUUID());

  }

  public static UUID generateRandomBasedUUID() {

    return UUID.randomUUID();

  }

  public static UUID generateTimeBasedUUID() {

    try {

      Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces();

      byte[] mac = null;

      while (networkInterfaces.hasMoreElements()) {

        NetworkInterface network = networkInterfaces.nextElement();

        byte[] temp = network.getHardwareAddress();

        if (temp != null && temp.length == 6)

          mac = temp;

          break;

        

      }

      if (mac == null) {

        mac = (new SecureRandom().generateSeed(6));

      }

      int clockSeq = new SecureRandom().nextInt();

      long timestamp = System.currentTimeMillis() * 10000 + 0x01B21DD213814000L;

      long mostSigBits = timestamp << 32 | (timestamp & 0xFFFF00000000L) >> 16 | (timestamp >> 48 & 0x0FFFL) | 0x1000L | ((mac[0] << 24) & 0xFF000000L) | ((mac[1] << 16) & 0xFF0000L) | ((mac[2] << 8) & 0xFF00L) | (mac[3] & 0xFFL);

      long leastSigBits = (mac[4] & 0xFFL) << 40 | (mac[5] & 0xFFL) << 32 | clockSeq << 16 | new SecureRandom().nextInt() & 0xFFFFL;

      return new UUID(mostSigBits, leastSigBits);

    } catch (Exception ex) {

      ex.printStackTrace();

      return UUID.randomUUID();

    }

  }

}

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复