Сравните две шестнадцатеричные строки в Java? - PullRequest
5 голосов
/ 23 ноября 2010

Я реализую простой DHT, используя протокол Chord в Java.Детали не важны, но я застрял в том, что мне нужно хешировать строки, а затем посмотреть, является ли одна хеш-строка «меньше» другой.

У меня есть некоторый код для вычисления хэшей с использованием SHA1, который возвращаетшестнадцатеричная строка длиной 40 цифр (типа String в Java), такая как:

69342c5c39e5ae5f0077aecc32c0f81811fb8193

Однако мне нужно иметь возможность сравнить два из них, например, так:

0000000000000000000000000000000000000000

меньше:

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

Это полный диапазон значений, поскольку 40-значная строка фактически представляет 40 шестнадцатеричных чисел в диапазоне 0123456789ABCDEF

Кто-нибудь знает, как это сделатьэто?

Заранее спасибо.

Ответы [ 4 ]

12 голосов
/ 23 ноября 2010

Значения 0..9 и A..F расположены в шестнадцатеричном порядке в наборе символов ASCII, поэтому

string1.compareTo(string2)

должно помочь.Если я что-то упустил.

6 голосов
/ 23 ноября 2010
BigInteger one = new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",16);
BigInteger two = new BigInteger("0000000000000000000000000000000000000000",16);
System.out.println(one.compareTo(two));
System.out.println(two.compareTo(one));

Выход: 1-1

1 означает, что больше -1 означает, что меньше 0 будет означать равные значения

1 голос
/ 23 ноября 2010

Поскольку шестнадцатеричные символы расположены в порядке возрастания ascii (как указано @Tenner), вы можете напрямую сравнить строки:

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
}
0 голосов
/ 23 ноября 2010

Поскольку строки имеют фиксированную длину и '0' <'1' <... <'A' <... <'Z', вы можете использовать <code>compareTo. Если вы используете шестнадцатеричные цифры в смешанном регистре, используйте compareToIgnoreCase.

...