比较Java中的两个十六进制字符串

时间:2010-11-23 18:57:03

标签: java string hash hex sha1

我正在使用Java中的Chord协议实现一个简单的DHT。细节并不重要,但我坚持的是我需要哈希字符串,然后查看一个哈希字符串是否“小于”另一个字符串。

我有一些使用SHA1计算哈希值的代码,它返回一个40位长的十六进制字符串(Java中的String类型),例如:

69342c5c39e5ae5f0077aecc32c0f81811fb8193

但是我需要能够比较其中两个,例如:

0000000000000000000000000000000000000000

小于:

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

这是完整的值范围,因为40位数字符串实际上代表范围为0123456789ABCDEF的40个十六进制数

有谁知道怎么做?

提前致谢。

4 个答案:

答案 0 :(得分:12)

0..9A..F在ASCII字符集中以十六进制顺序排列,因此

string1.compareTo(string2)

应该做的伎俩。除非我遗漏了什么。

答案 1 :(得分: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表示大于 -1表示小于 0表示相等的值

答案 2 :(得分: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
}

答案 3 :(得分:0)

由于字符串是固定长度而'0'&lt; '1'&lt; ......&lt; 'A'&lt; ......&lt; 'Z'你可以使用compareTo。如果您使用混合大小写十六进制数字,请使用compareToIgnoreCase