2010-11-23 495 views
4

我正在Java中使用Chord協議實現一個簡單的DHT。細節並不重要,但我堅持的是我需要散列字符串,然後看看一個散列字符串是否「小於」另一個。比較Java中的兩個十六進制字符串?

我有一些代碼來計算使用SHA1它返回一個40位長的十六進制字符串,例如(在Java中String類型)哈希:

69342c5c39e5ae5f0077aecc32c0f81811fb8193 

不過,我需要能夠比較兩個的這些所謂告訴,例如說:

0000000000000000000000000000000000000000 

小於:

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 

這是COMPLE te值的範圍爲40位數字符串實際上代表範圍內的40個十六進制數字ABCDEF

有誰知道如何做到這一點?

在此先感謝。

回答

9

0..9A..F是在ASCII字符集的十六進制數字的順序,因此

string1.compareTo(string2) 

應該做的伎倆。除非我錯過了一些東西。

+3

只要字符串永遠是相同的長度和大小寫。 – 2010-11-23 19:04:52

1

由於十六進制字符是按升序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 
} 
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)); 

輸出:
-1

1表示大於 -1表示小於 0表示等於值

0

由於串的固定長度和 '0' < '1' < ... < 'A' < ... < 'Z' 可以使用compareTo。如果您使用混合大小寫十六進制數字,請使用compareToIgnoreCase