Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:这段代码安全吗?_Java_Android_Thread Safety - Fatal编程技术网

Java:这段代码安全吗?

Java:这段代码安全吗?,java,android,thread-safety,Java,Android,Thread Safety,我正在制作一个Android应用程序,目前已经创建了一些用于生成代码的代码。生成的代码将被数据库检查,以查看代码是否正在使用。如果是,它将重新生成另一个代码,直到找到未使用的代码。这是使用do while循环完成的,虽然没有代码,但不会对用户造成明显的延迟。然而,如果有大量的代码,就会有明显的延迟,不是吗?代码如下: public static String generateCode(DBAdapter myDB, String mgrName){ String[] name = mgr

我正在制作一个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,因为用户要求代码包含四个字母和四个数字。代码用于从数据库中检索数据,这就是为什么它需要是唯一的。

与任何性能相关的问题一样,我们无法回答-您应该通过创建大量现有行,然后查看它的速度来分析它

就安全性而言,这是一个非常宽泛的术语,我不知道您使用这些代码的目的是什么,所以我不能轻松地告诉您代码是安全的。但是,您访问数据库的方式似乎没有任何可怕的问题。

只需使用UUID类或任何其他内置的伪随机数生成器-不要重新发明轮子。理论上,它们提供的冲突率非常小,在绝大多数情况下,您第一次尝试时都会生成唯一的id。但再一次,这取决于您的用例。我假设您正在做一些理智的事情,而不是在移动设备上生成和存储数以百万计的代码


请确保不要从主线程调用此例程-在这种情况下,即使数据库为空,用户也可能会注意到延迟。

使用if-check而不是ifcheck==true。谢谢,Christian,我会这样做,但代码总体上可以安全使用吗?您是否希望有数百名用户?成千上万的用户?数十万用户?正如你所说,这显然取决于你数据库中的代码数量,我们不知道。。。如果你想避免冲突,谷歌生成独特的IDS代码是可怕的,重写它没有递归和循环中的数据库调用。好的,谢谢,我会做一些背景研究。尽管我只是想确保代码在总体上是安全的。我听说过使用无限循环的问题。这可能是什么。这怎么可能是一个无限循环?@peggy如果一个管理者的所有代码都生成了10000个,因为它是4位数字。没有可能生成的代码。因此,结果总是错误的。这意味着while循环永远不会结束。这将导致应用程序崩溃。不过,你可以监控是否有10000个代码在使用,并根据需要进行处理。。还有,为什么10000只算作4个随机数,考虑到随机字母也是10*10*10*10*26*26*26*26*26=4569760000,代码需要记住或写下来,你看。稍后将使用此代码检索数据。最终用户请求了四个字母和四个数字,这就是我不能使用UUID的原因。否则我会的。