我有两个版本的方法都执行相同的功能。他们都试图生成一个随机的6位数字(转换为String uuid
)并通过将其与用户列表进行比较来检查它是否唯一。 uuid(此处未显示)。它将继续运行,直到生成的数字是唯一的。
因为我还是java的初学者,所以我只是想知道哪个版本更正确?此外,这两种方法都有更好的替代方案吗?
String getNewUserUUID(){
//inits
String uuid = "";
Random randomNumberGenerator = new Random();
int length = 6;
boolean unique;
//continue looping until we get a unique ID
do {
unique = false;
//generate number
for(int i = 0; i < length; i++){
uuid += randomNumberGenerator.nextInt(10);
}
//check to make sure it's unique
for(User u : users){
if(uuid.compareTo(u.getUUID()) != 0){
unique = true;
}
}
} while (!unique);
return uuid;
}
//version 2
String getNewUserUUID(){
//inits
String uuid = "";
Random randomNumberGenerator = new Random();
int length = 6;
boolean nonUnique;
do {
//generate the uuid
for (int i = 0; i < length; i++){
uuid += randomNumberGenerator.nextInt(10);
}
//check to make sure it's unique
nonUnique = false;
for(User u : this.users){
if(uuid.compareTo(u.getUUID()) == 0){
nonUnique = true;
break;
}
}
} while (nonUnique);
return uuid;
}
答案 0 :(得分:3)
使用java.util.UUID
或创建UUID的各种第三方库。
他们将使用各种信息生成一个UUID,以便在创建时可以知道它是唯一的,而不必“选择一些随机的东西,检查所有其他UUID,看看是否有重复”你正在做的循环。
是否需要6位数的UUID,或者您只是以此为例?
如果您的UUID确实是6位数字,那么可能会将java.util.concurrent.atomic.AtomicInteger
初始化为100000,并让您的生成UUID方法只返回AtomicInteger.getAndIncrement()
返回的内容(我正在遗漏任何错误检查 - 如果你的UUID正好是6位数,那么显然你需要做一些检查,并在你到达999999时采取任何适当的行动):
final public class PoorMansUuid
{
private static final AtomicInteger counter = new AtomicInteger(100000);
public static int generateUuid() {
return counter.getAndIncrement();
}
}
答案 1 :(得分:1)
没有单一的&#34;正确的&#34;办法。但是,如果您正在寻找替代方案,那么这里有一个更简单,更有效的方法,IMO:
String getNewUserUUID(){
//inits
Random randomNumberGenerator = new Random();
final int length = 6;
//continue looping until we get a unique ID
while (true) {
//generate number
StringBuilder sb = new StringBuilder(length);
for(int i = 0; i < length; i++){
sb.append(randomNumberGenerator.nextInt(10));
}
String uuid = sb.toString();
//check to make sure it's unique
for(User u : users){
if(uuid.equals(u.getUUID())){
continue;
}
}
return uuid;
}
}