2010-11-23 31 views
4

J'implémente un DHT simple en utilisant le protocole Chord en Java. Les détails ne sont pas importants mais la chose sur laquelle je suis bloqué est que j'ai besoin de hachage pour voir si une chaîne hachée est "inférieure à" une autre.Comparez deux chaînes hexadécimales dans Java?

J'ai un code pour calculer hash en utilisant SHA1 qui retourne un 40 chiffres à long chaîne hexagonale (de type String en Java) tels que:

69342c5c39e5ae5f0077aecc32c0f81811fb8193 

Cependant je dois être en mesure de comparer deux de ces soi de dire, par exemple, que:

0000000000000000000000000000000000000000 

est inférieure à:

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 

C'est Infrastruc La plage de 40 chiffres représente en réalité 40 nombres hexadécimaux dans la plageABCDEF

Est-ce que quelqu'un sait comment faire cela?

Merci d'avance.

Répondre

9

Les valeurs 0..9 et A..F sont dans l'ordre hex chiffres dans le jeu de caractères ASCII, si

string1.compareTo(string2) 

devrait faire l'affaire. À moins que je ne manque quelque chose.

+3

Pour autant que les cordes aient toujours la même longueur et le même cas. –

+0

@Chad: Je suppose que c'est vrai car il utilise un algorithme SHA1 en boîte. – Tenner

+1

@Chad et Tenner: Même si ce n'est pas le cas, il est plutôt facile de tamponner la longueur et d'unifier les cas. – Poindexter

1

Depuis caractères hexadécimaux sont dans l'ordre croissant ascii (comme @Tenner indiqué), vous pouvez comparer directement les cordes:

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

Sortie:
-1

1 indique plus de -1 indique moins de 0 indiquerait égal valeurs

0

Puisque les cordes sont de longueur fixe et '0' '1' < < ... < 'A' < ... < 'Z', vous pouvez utiliser compareTo. Si vous utilisez des chiffres hexadécimaux, utilisez compareToIgnoreCase.