我正在寻找在Java中创建唯一ID作为字符串的最佳方法。
任何指导都很感激,谢谢。
我应该提到我使用的是Java 5。
我正在寻找在Java中创建唯一ID作为字符串的最佳方法。
任何指导都很感激,谢谢。
我应该提到我使用的是Java 5。
当前回答
恕我直言,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',
'-','.','_','~'
};
}
其他回答
具有计数信息的唯一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.util.UUID: toString()
创建UUID。
String uniqueID = UUID.randomUUID().toString();
恕我直言,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',
'-','.','_','~'
};
}
如果你想要简短的、人类可读的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());
}