如何将两个字符串与随机位置android相结合

时间:2014-12-15 16:00:07

标签: java android

我试图生成一个许可证密钥,其中两个字符串合并为另一个字符串。

String key1 = "X1X2X3X4..Xn"; //this is for the imei key cellphone
String key2 = "Y1Y2Y3Y4M1M2D1D2H1H2m1m2"; //this is a key to mix with the first one

组合的结果应该是这样的:

String result = "D1H1X1X2X3Y2Y4X4X5...XnY3Y1D2m2m1H1H2";

我像这样每隔两个空格分割字符串,然后保存到数组中:

String [] key1splited = splitStringEvery(key1, 2);
String [] key2splited = splitStringEvery(key2, 2);

public String[] splitStringEvery(String s, int interval) {
    int arrayLength = (int) Math.ceil(((s.length() / (double)interval);
    String[] result = new String[arrayLength];

    int j = 0;
    int lastIndex = result.length - 1;
    for (int i = 0; i < lastIndex; i++) {
        result[i] = s.substring(j, j + interval);
        j += interval;
    } 
    result[lastIndex] = s.substring(j);

    return result;
}

如何组合我的字符串给我一个看起来像这样的结果:

String result = "D1H1X1X2X3Y2Y4X4X5...XnY3Y1D2m2m1H1H2";

我希望有人能告诉我如何解决这个问题。

我正在尝试做这样的事情,但这是非常糟糕的方法:

static String res = "";
String[] key1splited = splitStringEvery(key1, 2);
String[] key2splited = splitStringEvery(key2, 2);
for (int i = 0; i < key2splited.length; i++) {
    if (key2splited[i].equals("D1")) {
        res = key2splited[i];
    }
    if (key2splited[i].equals("H1")) {
        res += key2splited[i];
        for (int j = 0; j < key1splited.length; j++) {
            if (key1splited[j].equals("X1")) {
                res += key1splited[j];
            }
            if (key1splited[j].equals("X2")) {
                res += key1splited[j];
            }
            if (key1splited[j].equals("X3")) {
                res += key1splited[j];
            }
        }
    }
}

依此类推,但这并不是一个很好的方法,因为字符串会发生变化。

4 个答案:

答案 0 :(得分:1)

我很快,如果我得到它,你想要这样的东西?这可能会给你一些使用ArrayList的想法。 如果有人发现错误,可以自由编辑。

    String tmp = "X1X2X3";
    String tmp2 = "Y1Y2Y3";

    ArrayList<String> list = new ArrayList<String>();

    for(int i = 0 ; i < (tmp.length()/2) ; i  = i + 2)
    {
        list.add(tmp.substring(i,i+1));
        list.add(tmp2.substring(i,i+2));
    }

    int max = list.size();
    String finalMix = null;

    for(int j = 0 ; j < max; j++)
    {
        Random rnd = new Random();
        int rndNumber = rnd.nextInt((list.size()) + 1);
        finalMix += list.get(rndNumber);
        list.remove(rndNumber);
    }
    System.out.println(finalMix);
}

答案 1 :(得分:1)

我认为最简单的方法是将每个键中的标记分开(像X1,D1等2个字符长的标记),然后将标记合并为一个String

此外,您将随机播放String,提取随机令牌并构建许可证密钥:

Random rand = new Random(); // generate Random object only once for efficiency purposes

// ... rest of your code

String getLicenceKey(String key1, String key2){
    List<String> tokens = new ArrayList<String>();

    // add tokens from key1
    for(int i = 0; i < key1.length(); i += 2) {
        tokens.add(key1.substring(i, i + 2));
    }

    // add tokens from key2
    for(int i = 0; i < key2.length(); i += 2) {
        tokens.add(key2.substring(i, i + 2));
    }

    // build the random result out of the tokens
    StringBuilder result = new StringBuilder();
    while(tokens.size() != 0){
        int randomPos = rand.nextInt(tokens.size());
        result.append(tokens.remove(randomPos));
    }

    return result.toString();
}

您提供的输入的示例输出:

m2XnD2m1H2X1..Y3Y1Y2Y4M1X2M2D1H1X4X3
H2Y2X4M1M2H1Y3Y1m2X1X2D1m1Xn..X3Y4D2
X1X4X3H2D2H1..M2m2Y3m1Y4M1D1Y1X2XnY2

key1的示例输出=“ A1B1C1 ”,key2 =“ D1E1F1 ”:

D1F1B1A1C1E1
C1A1D1B1E1F1
F1E1B1C1D1A1

答案 2 :(得分:0)

看看这个问题。 How do I generate random integers within a specific range in Java?

生成一个像引用的随机数,并使用您的字符串数组中的随机索引重建一个字符串&#34; parts&#34;。

答案 3 :(得分:0)

我建议忘记混合使用字符串,并使用简单的加密哈希,例如:

org.apache.commons.codec.digest.DigestUtils.sha384Hex(key1+key2);
  • 这对于相同的key1,key2对总是产生相同的结果,但不能用于计算它们中的任何一个。
  • 你可以截断结果的24个字节,但当然你会增加碰撞的风险(你的12个字节仍然相当不错)。
  • 如果您需要撤消该过程(例如,从结果中获取key1,key2),或者只是在需要时将这两个服务器端与结果一起存储(这可能会产生隐私问题),您需要一个不同的策略。 / LI>