199

Java で一意の ID を文字列として作成する最良の方法を探しています。

ご指導ありがとうございます。

私はJava 5を使用していることに言及する必要があります。

4

11 に答える 11

407

UUIDを作成します。

String uniqueID = UUID.randomUUID().toString();
于 2009-09-07T14:51:01.363 に答える
55

人間が読める形式の短いIDが必要で、JVMの実行ごとに一意である必要がある場合は、次のようにします。

private static long idCounter = 0;

public static synchronized String createID()
{
    return String.valueOf(idCounter++);
}    

編集:コメントで提案された代替案-これはスレッドセーフのために内部の「魔法」に依存していますが、よりスケーラブルで同じように安全です:

private static AtomicLong idCounter = new AtomicLong();

public static String createID()
{
    return String.valueOf(idCounter.getAndIncrement());
}
于 2009-09-07T14:53:52.060 に答える
23

java.util.UUID : toString() メソッド

于 2009-09-07T14:50:09.193 に答える
19

これが私の 2 セントの価値です: [host name]-[application start time]-[current time]-[discriminator]IdFactoryの形式で ID を作成するクラスを以前に実装しました。これにより、JVM インスタンス間で ID が一意であることがほぼ保証され、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());
    }
  }
}
于 2009-09-07T15:15:51.057 に答える
11

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);
  }
}
于 2012-10-25T06:44:14.300 に答える
8

IMHO aperkinsが提供するエレガントなソリューションの原因はネイティブであり、使用するコードが少なくなります。しかし、より短い ID が必要な場合は、このアプローチを使用して、生成された文字列の長さを減らすことができます。

// 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',
    '-','.','_','~'
  };

}
于 2013-06-03T22:36:01.737 に答える
7

これにより、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);
}
于 2016-07-06T03:06:52.527 に答える
4

を使用して Java で一意の ID を作成し、onUUIDのようなメソッドを呼び出すことができます。randomUUID()UUID

String uniqueID = UUID.randomUUID().toString();

uniqueIDこれにより、戻り値の型が になる乱数が生成されますString

于 2015-08-27T09:30:08.477 に答える
2

Java で一意の ID を生成する方法は 3 つあります。

1) UUID クラスは、一意の ID を生成するための簡単な手段を提供します。

 UUID id = UUID.randomUUID();
 System.out.println(id);

2) SecureRandom と MessageDigest

//initialization of the application
 SecureRandom prng = SecureRandom.getInstance("SHA1PRNG");

//generate a random number
 String randomNum = new Integer(prng.nextInt()).toString();

//get its digest
 MessageDigest sha = MessageDigest.getInstance("SHA-1");
 byte[] result =  sha.digest(randomNum.getBytes());

System.out.println("Random number: " + randomNum);
System.out.println("Message digest: " + new String(result));

3) java.rmi.server.UID を使用する

UID userId = new UID();
System.out.println("userId: " + userId);
于 2017-10-10T19:47:55.353 に答える