如何在Java中创建唯一的ID ?

我正在寻找在Java中创建唯一ID作为字符串的最佳方法。

任何指导都很感激,谢谢。

我应该提到我使用的是Java 5。

445058 次浏览

java.util.UUID: toString()方法

创建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());
}

以下是我的两美分价值:我之前实现了一个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());
}
}
}

使用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

这为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的方法。

1) UUID类提供了一种生成唯一id的简单方法。

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

2) securerrandom和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);

具有计数信息的唯一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;
}
}
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;
}