How to combine two lines with random android position

I am trying to create a license key with two lines combined into one line.

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

The result of the combination should be like this:

 String result = "D1H1X1X2X3Y2Y4X4X5...XnY3Y1D2m2m1H1H2"; 

I broke my lines every two spaces like this, and I save in an array:

 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; } 

How can I make a combination of my lines, giving me a result that looks like this:

 String result = "D1H1X1X2X3Y2Y4X4X5...XnY3Y1D2m2m1H1H2"; 

Hope someone can give me an idea how to solve this.

I am trying to do something like this, but this is a very bad method:

 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]; } } } } 

And so on, but this is not a very good way to do this, because the lines will change.

+6
source share
4 answers

I think the easiest way to do this is to extract tokens from each key (2-char long tokens such as X1, D1, etc.), and then combine the tokens into one String .

Next, you shuffle the String , extract random tokens and create a license key:

 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(); } 

Examples of outputs for the inputs you entered:

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

Examples of outputs for the key1 = "A1B1C1", key2 = "D1E1F1":

 D1F1B1A1C1E1 C1A1D1B1E1F1 F1E1B1C1D1A1 
+1
source

I'm in a hurry, so if I get it, do you want something like this? This may give you some ideas using an ArrayList. If someone finds something wrong, you can freely edit.

  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
source

Take a look at this question. How to generate random integers in a specific range in Java?

Create a random number like the one quoted and rebuild the line with your random index from your array of "parts" of the string.

0
source

I would suggest forgetting about string mixing and use a simple cryptographic hash, for example:

 org.apache.commons.codec.digest.DigestUtils.sha384Hex(key1+key2); 
  • This always gives the same result for one pair of key1, key2, but cannot be used to calculate any of them.
  • You can truncate the resulting 24 bytes, but of course, you slightly increase the risk of collisions (you are still pretty good with 12 bytes).
  • You need a different strategy if you need to reverse the process (i.e. get key1, key2 from the result) or just save these two server sides with the result if you need (this can lead to privacy problems).
0
source

Source: https://habr.com/ru/post/979636/


All Articles