Java:这段代码安全吗?

时间:2015-08-04 16:37:02

标签: java android thread-safety

我正在制作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。该代码用于从数据库中检索数据,以及它为什么需要唯一的原因。

2 个答案:

答案 0 :(得分:2)

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

就安全性而言,这是一个非常广泛的术语,我对你使用这些代码的内容一无所知,所以我不能轻易地告诉你代码是安全的。但是,您访问数据库的方式似乎没有任何可怕的问题。

答案 1 :(得分:1)

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

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