【问题标题】:Compare two hex strings in Java?比较Java中的两个十六进制字符串?
【发布时间】:2011-05-14 15:59:41
【问题描述】:

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

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

69342c5c39e5ae5f0077aecc32c0f81811fb8193

但是我需要能够比较其中的两个以便判断,例如:

0000000000000000000000000000000000000000

小于:

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

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

有人知道怎么做吗?

提前致谢。

【问题讨论】:

    标签: java string hash hex sha1


    【解决方案1】:

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

    string1.compareTo(string2)
    

    应该可以解决问题。除非我错过了什么。

    【讨论】:

    • 只要字符串的长度和大小写始终相同。
    • @Chad:我假设这是真的,因为他使用的是固定 SHA1 算法。
    • @Chad and Tenner:即使不是,填充长度和统一大小写也相当容易。
    【解决方案2】:

    由于十六进制字符按 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】:
      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 表示相等的值

      【讨论】:

        【解决方案4】:

        由于字符串是固定长度的,并且 '0' compareTo。如果您使用混合大小写的十六进制数字,请使用compareToIgnoreCase

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-16
          • 2013-05-24
          相关资源
          最近更新 更多