2010-11-23 498 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