Javaで一意のIDを文字列として作成する最適な方法を探しています。
ご指導ありがとうございます。
Java 5を使用していることに言及する必要があります。
UUID を作成します。
String uniqueID = UUID.randomUUID().toString();
短く、人間が読み取れる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());
}
Java.util.UUID
:toString()メソッド
ここに私の2セントの価値があります。以前に[ホスト名]-[アプリケーション開始時間]-[現在の時間]-[弁別者]の形式でIDを作成するIdFactory
クラスを実装しました。これにより、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());
}
}
}
これにより、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);
}
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);
}
}
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',
'-','.','_','~'
};
}
UUID
を使用してJavaに一意のIDを作成し、UUID
でrandomUUID()
のようなメソッドを呼び出すことができます。
String uniqueID = UUID.randomUUID().toString();
これにより、戻り値の型がuniqueID
になるランダムなString
が生成されます。
String name,password;
public int idGen() {
int id = this.name.hashCode() + this.password.hashCode();
int length = String.valueOf(id).length();
int Max_Length = 5;
if(String.valueOf(id).length()>Max_Length)
{
id = (int) (id /Math.pow(10.0,length - Max_Length ));
}
return id;
}
カウント情報を持つ一意のID
import Java.util.concurrent.atomic.AtomicLong;
public class RandomIdUtils {
private static AtomicLong atomicCounter = new AtomicLong();
public static String createId() {
String currentCounter = String.valueOf(atomicCounter.getAndIncrement());
String uniqueId = UUID.randomUUID().toString();
return uniqueId + "-" + currentCounter;
}
}
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);