如何在Java中创建唯一ID?

Sup*_*tux 162 java uniqueidentifier

我正在寻找在Java中创建一个唯一ID作为String的最佳方法.

任何指导表示赞赏,谢谢.

我应该提到我正在使用Java 5.

ape*_*ins 333

创建一个UUID.

String uniqueID = UUID.randomUUID().toString();
Run Code Online (Sandbox Code Playgroud)

  • @pjp:一个真正随机生成的ID通常不是人类可读的.并且使它变得人性化通常会使它变得更长,这反过来又会降低人类的可读性. (9认同)
  • 这不是人类可读的所有*... (6认同)
  • 我不知道他想要一个人类可读的唯一ID ...这会增加相当多的难度 (5认同)
  • 为什么我们不能使用 `System.currentTimeMillis` 来生成一个单调递增的序列并添加一些随机正整数盐? (2认同)

Mic*_*rdt 47

如果您需要简短的,人类可读的ID,并且每个JVM运行只需要它们是唯一的:

private static long idCounter = 0;

public static synchronized String createID()
{
    return String.valueOf(idCounter++);
}    
Run Code Online (Sandbox Code Playgroud)

编辑:评论中建议的替代方案 - 这依赖于线程安全的底层"魔力",但更具可扩展性,同样安全:

private static AtomicLong idCounter = new AtomicLong();

public static String createID()
{
    return String.valueOf(idCounter.getAndIncrement());
}
Run Code Online (Sandbox Code Playgroud)

  • @Adamski:只要您不重启JVM,只运行1个JVM并且只要计数器不溢出,此方法将只创建唯一值.所有这些假设都很容易被打破.在这些情况下,UUID.randomUUID()实际上更可靠. (10认同)
  • 与 UUID 方法相比,我更喜欢 Michael 的方法,因为在调试时顺序 ID 通常更有用/更容易。此外,UUID.randomUUID() 不能 100% 保证返回唯一值。 (2认同)
  • 虽然它不是100%保证,但是你与任何人碰撞的可能性都很低(因为整个空间大于估计存在于宇宙中的原子数),因此100%保证.如果您需要全球唯一性,那么这是实现这一目标的最简单方法.但是,如果您只需要本地唯一性(即当前现有的应用程序),那么AtomicInteger绝对是您的选择. (2认同)

Mit*_*eat 22

java.util.UUID :toString()方法


Ada*_*ski 19

这是我的两分钱:我以前实现了一个IdFactory[主机名] - [应用程序开始时间] - [当前时间] - [鉴别器]格式创建ID 的类.这在很大程度上保证了ID在JVM实例中是唯一的,同时保持ID可读(尽管很长).这是代码,以防任何用途:

public class IdFactoryImpl implements IdFactory {
  private final String hostName;
  private final long creationTimeMillis;
  private long lastTimeMillis;
  private long discriminator;

  public IdFactoryImpl() throws UnknownHostException {
    this.hostName = InetAddress.getLocalHost().getHostAddress();
    this.creationTimeMillis = System.currentTimeMillis();
    this.lastTimeMillis = creationTimeMillis;
  }

  public synchronized Serializable createId() {
    String id;
    long now = System.currentTimeMillis();

    if (now == lastTimeMillis) {
      ++discriminator;
    } else {
      discriminator = 0;
    }

    // creationTimeMillis used to prevent multiple instances of the JVM
    // running on the same host returning clashing IDs.
    // The only way a clash could occur is if the applications started at
    // exactly the same time.
    id = String.format("%s-%d-%d-%d", hostName, creationTimeMillis, now, discriminator);
    lastTimeMillis = now;

    return id;
  }

  public static void main(String[] args) throws UnknownHostException {
    IdFactory fact = new IdFactoryImpl();

    for (int i=0; i<1000; ++i) {
      System.err.println(fact.createId());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 8

这为UUID生成添加了更多随机性,但确保每个生成的id具有相同的长度

import org.apache.commons.codec.digest.DigestUtils;
import java.util.UUID;

public String createSalt() {
    String ts = String.valueOf(System.currentTimeMillis());
    String rand = UUID.randomUUID().toString();
    return DigestUtils.sha1Hex(ts + rand);
}
Run Code Online (Sandbox Code Playgroud)

  • UUID.randomUUID()已使用"加密强"随机数生成器生成ID.添加"更多随机性"是什么意思?根据纪元时间附加一个随机的'盐'你会得到什么? (9认同)

rha*_*ari 7

恕我直言aperkins提供了一个优雅的解决方案原因是本机和使用较少的代码.但是如果你需要一个较短的ID,你可以使用这种方法来减少生成的String长度:

// usage: GenerateShortUUID.next();
import java.util.UUID;

public class GenerateShortUUID() {

  private GenerateShortUUID() { } // singleton

  public static String next() {
     UUID u = UUID.randomUUID();
     return toIDString(u.getMostSignificantBits()) + toIDString(u.getLeastSignificantBits());
  }

  private static String toIDString(long i) {
      char[] buf = new char[32];
      int z = 64; // 1 << 6;
      int cp = 32;
      long b = z - 1;
      do {
          buf[--cp] = DIGITS66[(int)(i & b)];
          i >>>= 6;
      } while (i != 0);
      return new String(buf, cp, (32-cp));
  }

 // array de 64+2 digitos 
 private final static char[] DIGITS66 = {
    '0','1','2','3','4','5','6','7','8','9',        'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
    '-','.','_','~'
  };

}
Run Code Online (Sandbox Code Playgroud)


p u*_*ran 6

Java - 生成唯一ID

UUID是在Java中生成唯一ID的最快速,最简单的方法.

import java.util.UUID;

public class UniqueIDTest {
  public static void main(String[] args) {
    UUID uniqueKey = UUID.randomUUID();
    System.out.println (uniqueKey);
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我们可以使用 java 中的onUUID方法来创建一个唯一的 ID 。randomUUID()UUID

String uniqueID = UUID.randomUUID().toString();
Run Code Online (Sandbox Code Playgroud)

uniqueID这将生成返回类型为 的随机数String