2016-09-07 3 views
-4

Ich möchte eine eindeutige alphanumerische Zeichenfolge der Länge 28 aus zwei eindeutigen alphanumerischen Zeichenfolgen generieren. Ist es mathematisch möglich, eine kollisionsfreie Saite aus zwei einzigartigen Saiten zu haben?Wie generiert man eine eindeutige Zeichenfolge der Länge 28 aus zwei eindeutigen Zeichenfolgen der Länge 28?

hier ist das, was ich tat,

ASCII_NUMBER_RANGE_START = 48; 
ASCII_ALPHABET_RANGE_START =55; 

for (int i = 0; i < firstArray.length; i++) { 
     int tempASCIIValue = (Character.getNumericValue(firstArray[i]) + Character.getNumericValue(secondArray[i])) % 35; 
     if (tempASCIIValue <= 9) { 
      FINAL_ASCII_VALUE = tempASCIIValue + ASCII_NUMBER_RANGE_START; 
     } else { 
      FINAL_ASCII_VALUE = tempASCIIValue + ASCII_ALPHABET_RANGE_START; 
     } 
     combinedArray[i] = (char) FINAL_ASCII_VALUE; 
    } 
    return new String(combinedArray); 
} 

In obigem Code, ich bin nicht sicher, ob die resultierende Zeichenfolge als ihre Mutter Strings als einzigartig stark ist.

Hinweis: die erzeugte Zeichenfolge gleiche Länge wie die Mutter Zeichenfolge haben

Jede Hilfe sehr geschätzt wird. Vielen Dank.

+0

Was haben Sie versucht? – Amy

+0

Angenommen, die Verkettung (eindeutiges A, eindeutiges B) ist immer ein eindeutiges String-Literal. – tpk

+0

versuchen Sie diesen Link - http://www.javapractices.com/topic/TopicAction.do?Id=56 – tpk

Antwort

1

Da Kollisionen unvermeidlich sind. Wir können Ideen wie Hashcode-Generierung betrachten. In einer Hashtabelle möchten Sie für jedes Objekt einen Hashcode generieren. Idealerweise möchten Sie eine Perfect hash function, aber das ist ziemlich schwierig zu implementieren.

Sie können möglicherweise mit einer Hash-Funktion erhalten, siehe zum Beispiel Best implementation for hashCode method. Ein einfacher mit zwei ganzzahligen Variablen ist

Für Ihre Implementierung könnten Sie dies ändern, um mit Charakter zu arbeiten. Wenn du glücklich bist, einen Charakter zu verlieren, der 26 + 26 + 9 = 64 Möglichkeiten für jeden Charakter gibt. Dies bedeutet, dass Sie 6 Bits für jedes Zeichen und 168 Bits für den gesamten Eingang verwenden können, die in 6 ganze Zahlen passen. Führen Sie dann einfach die generateHashCode() Methode für jedes Integerpaar aus.

+0

danke für die Unterstützung. –

0

Sie können beide String-UIDs (28 stellige alphanumerische Zeichen) mit StringBuilder/StringBuffer hinzufügen und den verknüpften String in eine beliebige Implementierung von Set einfügen. Die Set-Implementierung filtert die doppelten Elemente aus. Hier

ist der Beispielcode:

import java.util.LinkedHashSet; 

public class Delete1 { 
    public static void main(String[] args) { 
     LinkedHashSet<String> impl=new LinkedHashSet<String>(); 
     for (int i = 0; i < 5; i++) { 
      String uid1="[email protected]#$%^&"; 
      String uid2="[email protected]#$%^&"; 
      StringBuilder builder=new StringBuilder(); 
      builder.append(uid1); 
      builder.append(uid2); 
      impl.add(builder.toString()); 
     } 
     for (String value : impl) { 
      System.out.println(value); 
     } 
    } 
} 

Obwohl die Schleife 5-mal iteriert aber die Ausgabe ist

[email protected]#$%^&[email protected]#$%^& 

Sie Ihre Schleifenvariable hinzufügen können eindeutige ID zu erstellen.

+0

danke für Ihre Mühe, ich werde es ausprobieren und lassen Sie wissen, –

+0

eigentlich iam bekommen eine Konkatation der beiden Saiten, ich brauche es von der gleichen Länge wie die der Elternkette sein. –

+0

@Sayak, die generierte Zeichenfolge muss die Länge 28 – tpk

Verwandte Themen