我正在制作Android应用程序并且目前已经创建了一些用于生成代码的代码。生成的代码将被检查数据库以查看代码是否正在使用中。如果是,它将重新生成另一个代码,直到找到未使用的代码。这是使用do-while循环完成的,虽然没有代码,但用户不会有明显的延迟。但是,如果有大量代码,那么会有明显的延迟吗?代码如下:
public static String generateCode(DBAdapter myDB, String mgrName){
String[] name = mgrName.split(" +");
String fName = name[0];
String lName = name[1];
String fLetter = fName.substring(0, 1).toUpperCase();
String lLetter = lName.substring(0, 3).toUpperCase();
int randomPIN = (int) (Math.random() * 9000) + 1000;
String pin = String.valueOf(randomPIN);
String letters = new StringBuilder().append(fLetter).append(lLetter).append(pin).toString();
Boolean result = checkCode(myDB, letters);
if(result == true){
return(letters);
}
else{
String code = "";
Boolean resultfail = false;
do{
int randomPINFail = (int) (Math.random() * 9000) + 1000;
String generatedCode = new StringBuilder().append(fLetter).append(lLetter).append(randomPINFail).toString();
Boolean check = checkCode(myDB, generatedCode);
if(check){
resultfail = true;
code = generatedCode;
}
}while(!resultfail);
return code;
}
}
public static Boolean checkCode(DBAdapter myDB, String code){
Cursor cursor = myDB.getRowComplaint(code);
if(cursor.getCount() == 0){
return true;
}
else{
return false;
}
}
我的问题是,生成器选择已使用多次的代码的可能性是多少,用户会注意到延迟?请记住,生成器将使用不同的管理器名称以及不同的编号。这段代码可以安全使用吗?如果没有,可以做些什么来保证安全?
编辑:由于用户请求代码包含四个字母和四个数字,因此我无法使用UUID。该代码用于从数据库中检索数据,以及它为什么需要唯一的原因。
答案 0 :(得分:2)
与任何与性能相关的问题一样,我们无法回答 - 您应该通过创建大量现有行然后查看它的速度来自行分析。
就安全性而言,这是一个非常广泛的术语,我对你使用这些代码的内容一无所知,所以我不能轻易地告诉你代码是安全的。但是,您访问数据库的方式似乎没有任何可怕的问题。
答案 1 :(得分:1)
只需使用UUID
类或任何其他内置伪随机数生成器 - 不要重新发明轮子。从理论上讲,它们会提供如此小的碰撞率,在绝大多数情况下,你会在第一次尝试时产生唯一的id。但再次,这取决于您的用例。我假设您正在做一些理智的事情,而不是在移动设备上生成和存储数百万的这些代码。
请务必不要从主线程调用此例程 - 在这种情况下,即使数据库为空,use也可能会注意到延迟。