【问题标题】:Java array checksum independent of element order独立于元素顺序的 Java 数组校验和
【发布时间】:2014-09-10 11:41:01
【问题描述】:

假设我有两个数组,例如[B,D,C,A][B,A,D,C]。什么机制会在两个数组(以及包含其元素排列的任何数组)上生成相同的校验和?

在以下示例中,check_acheck_b 将不相等。将元素按字母顺序排列不是一种选择,因为数组中的对象可能根本不是字符串或任何可排序的对象。

String[] a = {"B","D","C","A"};
String[] b = {"B","A","D","C"};

String check_a = a.hashCode();
String check_b = b.hashCode();

【问题讨论】:

标签: java arrays hash checksum


【解决方案1】:

快速示例

public class ArrayHash {

    public static void main(String[] args) {
        String[] one = new String[]{"A", "B", "C", "D"};
        String[] two = new String[]{"D", "C", "B", "A"};
        System.out.println("One = " + one.hashCode());
        System.out.println("Two = " + two.hashCode());
        System.out.println("Method for one = "+hash(one));
        System.out.println("Method for two = "+hash(two));
    }

    private static int hash(Object[] array) {
        int ret = 0;
        for (Object c : array) {
            ret += (124567890 + c.hashCode()) * c.hashCode();
        }
        return ret;
    }
}

它给出一个输出

One = 366712642
Two = 1829164700
Method for one = 266
Method for two = 266

如您所见,您必须遍历所有元素并对它们的哈希值求和(或相乘)。无论它们是什么顺序,这都会给你相同的结果。

【讨论】:

  • 谢谢你回答了我的问题。但是有没有办法使总和也唯一,即我可以以某种方式确保具有不同条目的两行不会有相同的校验和?
  • 字符串的哈希码不是很独特,而且很小,所以总和可以相等。如果您不想避免它,您可以尝试使其更复杂,例如 ret+=(1245 + c.hashCode())*25; 这还不是解决方案,但您可以尝试一下,看看它如何为您工作
  • ret += (124567890 + c.hashCode()) * c.hashCode(); 这应该会更好
【解决方案2】:

假设您有一个获取元素校验和的函数。要获得您想要的校验和,您需要使用Commutative property 查找操作,其中有很多。例如+*^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多