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

6
我正在使用Java实现一个简单的DHT,采用Chord协议。具体细节不是很重要,但我卡住了,需要哈希字符串并检查一个哈希字符串是否“小于”另一个。
我有一些使用SHA1计算哈希值的代码,它返回一个40位长的十六进制字符串(在Java中为String类型),例如:
69342c5c39e5ae5f0077aecc32c0f81811fb8193

然而,我需要能够比较其中两个,以便可以告诉,例如:
0000000000000000000000000000000000000000

小于:
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

这是一个完整的值范围,因为这个40位数字字符串实际上代表了范围在0123456789ABCDEF之间的40个十六进制数。
有人知道如何做到这一点吗?
提前致谢。
4个回答

12

在ASCII字符集中,值为0..9A..F按照十六进制数字的顺序排列,因此

string1.compareTo(string2)

应该可以解决问题。除非我漏掉了什么。


3
只要字符串长度和大小写始终保持相同,就可以。 - Chad Okere
@Chad:我假设是这样的,因为他正在使用一个预先编写好的SHA1算法。 - James Cronen
1
@Chad 和 Tenner:即使不是,填充长度和统一大小写也相当容易。 - Poindexter

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 则表示相等的值


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
}

0

由于字符串长度固定且 '0' < '1' < ... < 'A' < ... < 'Z',因此您可以使用 compareTo。如果您使用大小写混合的十六进制数字,请使用 compareToIgnoreCase


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接