2014-12-15 6 views
6

Ich versuche, einen Lizenzschlüssel mit zwei Strings kombiniert in einer anderen Zeichenfolge zu generieren.Wie kombinieren zwei Strings mit zufälliger Position 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 

Das Ergebnis der Kombination so sein sollte:

String result = "D1H1X1X2X3Y2Y4X4X5...XnY3Y1D2m2m1H1H2"; 

ich so meine Strings aufgeteilt alle zwei Räume und speichere ich in ein 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; 
} 

Wie kann ich Die Kombination meiner Strings ergibt ein Ergebnis, das wie folgt aussieht:

String result = "D1H1X1X2X3Y2Y4X4X5...XnY3Y1D2m2m1H1H2"; 

Ich hoffe, jemand könnte mir eine Idee geben, wie man das löst.

Ich versuche, so etwas zu tun, aber es ist sehr schlecht Methode:

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

Und so weiter, aber das ist kein guter Weg, es zu tun, weil die Saiten ändern werden.

+1

Kannst du klar sein, wie du zwei Saiten mischt? – SMA

+1

Warum möchten Sie diese beiden _mix_? Ist es der Fall, dass Sie einen deterministischen Lizenzschlüssel basierend auf Umweltparametern erhalten möchten, der aber nicht sofort erkennbar ist? Wenn ja, möchten Sie, dass der Schlüssel reversibel ist (d. H. Key1 und key2 berechenbar aus dem Ergebnis (vielleicht im Besitz eines dritten Geheimnisses))? Es gibt bessere Methoden für jede der oben genannten als die beiden Strings mischen ... –

+0

Nun versuche ich dies zu tun –

Antwort

1

Ich denke, der einfachste Weg, dies zu tun, könnte die Token aus jeder Taste (2-Zeichen lange Token wie X1, D1 usw.) und dann kombinieren die Token in einem einzigen String zu trennen ist.

Ferner mischen Sie die String up, zufällige Token zu extrahieren und den Aufbau der Lizenzschlüssel:

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

Beispiel Ausgänge für die Eingänge Sie haben:

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

Beispiel Ausgänge für key1 =“A1B1C1 ", key2 =" D1E1F1 ":

D1F1B1A1C1E1 
C1A1D1B1E1F1 
F1E1B1C1D1A1 
+0

Dank ich tat diese Arraylist Arraylist = new Arraylist (); for (int i = 0; i

+0

Danke für deine Hilfe und Zeit, deine Lösung hilft mir sehr. –

+0

@SalvadorFigueroa kein Problem, froh, zu helfen – nem035

0

Werfen Sie einen Blick auf diese Frage SO. How do I generate random integers within a specific range in Java?

Generieren Sie eine Zufallszahl wie angegeben, und erstellen Sie eine Zeichenfolge mit Ihrem zufälligen Index aus Ihrem Array von Zeichenfolge "Teile".

+0

Ich schaue jetzt, lass mich versuchen zu verstehen. Danke für deine Zeit –

+0

@Salvador, kein Problem. Es ist ein einfaches Konzept zu folgen; Sie haben Ihre Zeichenkette "Teile" indiziert (Teilstrings teilen und in ein Array setzen), lesen Sie nun wieder, was Sie zufällig haben (erhalten Sie zufällige Ganzzahl, dann erhalten Sie die Teilzeichenkette an Ihrem zufälligen Index und fügen Sie es zum Beispiel an einen 'StringBuilder' an .) – MeetTitan

+0

Danke für deine Hilfe und Zeit :) Ich habe das Problem mit der nem Idee gelöst. –

0

Ich würde vorschlagen, die Vermischung von Strings und mit einfachen verschlüsselten Hash, wie zu vergessen:

org.apache.commons.codec.digest.DigestUtils.sha384Hex(key1+key2); 
  • Daraus ergibt sich immer das gleiche Ergebnis für den gleichen Tasten 1, 2 Paar, kann aber nicht verwendet werden berechne einen von ihnen.
  • Sie können die resultierenden 24 Bytes abschneiden, aber natürlich erhöhen Sie das Risiko von Kollisionen etwas (Sie sind immer noch ziemlich gut mit 12 Bytes).
  • Sie benötigen eine andere Strategie, wenn Sie den Prozess umkehren müssen (z. B. Schlüssel1, Schlüssel2 aus dem Ergebnis), oder einfach diese zwei Server-Seite mit dem Ergebnis speichern, wenn Sie müssen (dies kann zu Datenschutzproblemen führen).
+0

Vielen Dank für Ihre Hilfe –

1

Ich habe es eilig, wenn ich es bekomme, willst du so etwas? Dies kann Ihnen einige Ideen mit ArrayList geben. Wenn jemand etwas falsch finden, fiel frei zu bearbeiten.

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); 
} 
+0

Danke, war fast in der Nähe, was ich brauche Ich versuchte mit ArrayList auch, die Lösung wurde von nem zur Verfügung gestellt, aber ich schätze wirklich Ihre Hilfe und die anderen, ich lerne viel von hier. –