2010-11-23 8 views
4

Ich implementiere ein einfaches DHT mit dem Chord-Protokoll in Java. Die Details sind nicht wichtig, aber die Sache, an der ich festhalte, ist, dass ich Strings hacken muss und dann sehe, ob eine Hash-Zeichenfolge "weniger als" eine andere ist.Vergleichen Sie zwei Hex-Strings in Java?

Ich habe einige Code-Hashes zu berechnen SHA1, die eine 40-stellige lange Hex-String zurückgibt (vom Typ String in Java), wie zB:

69342c5c39e5ae5f0077aecc32c0f81811fb8193 

Allerdings muss ich der Lage sein, zwei davon zu vergleichen, so zu sagen, zum Beispiel, dass:

0000000000000000000000000000000000000000 

weniger als:

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 

Dies ist comple Der Wertebereich, da die 40-stellige Zeichenfolge tatsächlich 40 Hexadezimalzahlen im BereichABCDEF

darstellt. Weiß jemand, wie man das macht?

Vielen Dank im Voraus.

Antwort

9

Die Werte 0..9 und A..F sind im Set Hex-stellige Reihenfolge in dem ASCII-Zeichen, so

string1.compareTo(string2) 

sollte es tun. Es sei denn, ich verpasse etwas.

+3

Solange die Zeichenfolgen immer die gleiche Länge haben, und Groß-/Kleinschreibung. –

+0

@Chad: Ich gehe davon aus, dass das stimmt, da er einen vordefinierten SHA1-Algorithmus verwendet. – Tenner

+1

@Chad und Tenner: Selbst wenn es nicht ist, ist es ziemlich einfach, die Länge zu puffern und die Fälle zu vereinheitlichen. – Poindexter

1

Da Hex-Zeichen in aufsteigender Reihenfolge ascii sind (wie @Tenner angegeben), können Sie direkt die Saiten vergleichen:

String hash1 = ...; 
String hash2 = ...; 

int comparisonResult = hash1.compareTo(hash2); 
if (comparisonResult < 0) { 
    // hash1 is less 
} 
else if (comparisonResult > 0) { 
    // hash1 is greater 
} 
else { 
    // comparisonResult == 0: hash1 compares equal to hash2 
} 
6
BigInteger one = new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",16); 
BigInteger two = new BigInteger("0000000000000000000000000000000000000000",16); 
System.out.println(one.compareTo(two)); 
System.out.println(two.compareTo(one)); 

Ausgang:
-1

1 bedeutet größer als -1 bedeutet weniger als 0 würde gleich anzeigen Werte

0

Da die Saiten Länge und '0' < '1' < ... < 'A' < ... < 'Z' festgelegt sind, können Sie compareTo verwenden. Wenn Sie Hexadezimalziffern mit Groß- und Kleinbuchstaben verwenden, verwenden Sie compareToIgnoreCase.