【问题标题】:deepHashCode with byte arraydeepHashCode 与字节数组
【发布时间】:2011-01-12 17:26:58
【问题描述】:

由于某种原因,Arrays.deepHashCode() 无法与 byte[] 一起使用。
有没有其他的等价物?

【问题讨论】:

  • 你指的是java.util.Arrays中的deepHashCode(),我猜?

标签: java arrays hashcode


【解决方案1】:

首先,不需要“深”。这是一个原始的。你不需要 Deep。

只需使用Arrays.hashCode(byte[] yourArray)

编辑:澄清一下,Deep 意味着深入研究数组中包含的对象。鉴于您正在处理原语,您只需要在计算中使用原语值本身。这就是为什么 Deep 方法都不是围绕原语进行的。

【讨论】:

  • 注意:对于任何好奇的人,我在单独的答案中添加了嵌套数组的 deepHashCode 示例
【解决方案2】:

接受的答案是正确的:使用 Arrays.hashCode 为具有相同值的 byte[] 提供相同的结果。 Arrays.deepHashCode 如果你有一个嵌套(深)结构是必需的。

import java.util.Arrays;

public class A {

    public static void main(String[] args) {
        byte[] a = {10, 32, -43, 80};
        byte[] b = {13, -40};
        byte[] c = {10, 32, -43, 80};

        System.out.println("NOTE: A and C have identical values, B differs");
        System.out.println("Using byte[].hashCode(): A and C have different hash codes");
        System.out.println("a = " + a.hashCode());
        System.out.println("b = " + b.hashCode());
        System.out.println("c = " + c.hashCode());

        System.out.println("Using Arrays.hashCode(): A and C have identical hash codes");
        System.out.println("a = " + Arrays.hashCode(a));
        System.out.println("b = " + Arrays.hashCode(b));
        System.out.println("c = " + Arrays.hashCode(c));

        System.out.println("Using Arrays.deepHashCode(): A and C have identical hash codes");
        System.out.println("a = " + Arrays.deepHashCode(new Object[]{a}));
        System.out.println("b = " + Arrays.deepHashCode(new Object[]{b}));
        System.out.println("c = " + Arrays.deepHashCode(new Object[]{c}));
    }
}

这会导致输出:

NOTE: A and C have identical values, B differs
Using byte[].hashCode(): A and C have different hash codes
a = 141847843
b = 329849131
c = 1119051810
Using Arrays.hashCode(): A and C have identical hash codes
a = 1250930
b = 1324
c = 1250930
Using Arrays.deepHashCode(): A and C have identical hash codes
a = 1250961
b = 1355
c = 1250961

这是一个示例,说明何时需要 Arrays.deepHashCode

import java.util.Arrays;

public class B {
    public static void main(String[] args) {
        Object[] d = {"abc", "def", new String[]{"ghi"}};
        Object[] e = {"abc", "def", new String[]{"ghi"}};

        System.out.println("NOTE: D and E have identical nested values");
        System.out.println("Using Object[].hashCode(): different");
        System.out.println("d = " + d.hashCode());
        System.out.println("f = " + e.hashCode());

        System.out.println("Using Arrays.hashCode(): still different");
        System.out.println("d = " + Arrays.hashCode(d));
        System.out.println("e = " + Arrays.hashCode(e));

        System.out.println("Using Arrays.deepHashCode(): identical");
        System.out.println("d = " + Arrays.deepHashCode(d));
        System.out.println("e = " + Arrays.deepHashCode(e));
    }
}

输出:

NOTE: D and E have identical nested values
Using Object[].hashCode(): different
d = 241990244
f = 1943487137
Using Arrays.hashCode(): still different
d = 1057745997
e = 709187068
Using Arrays.deepHashCode(): identical
d = 95807651
e = 95807651

【讨论】:

    【解决方案3】:

    如果您希望包含相同字节的两个字节数组具有等效的哈希码,则使用 deepHashCode 确实是正确的,您只需要对 byte[] 数组进行一些额外的转换。

    import java.utils.Arrays;
    
    public class A {
      public static void main(String[] args) {
        byte[] a = {10,32,-43,80};
        byte[] b = {13,-40};
        byte[] c = {10,32,-43,80};
        // A and C will have different hash codes
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
        System.out.println(c.hashCode());
        // A and C will now have equivalent hash codes
        System.out.println(Arrays.deepHashCode(new Object[]{a}));
        System.out.println(Arrays.deepHashCode(new Object[]{b}));
        System.out.println(Arrays.deepHashCode(new Object[]{c}));
      }
    }
    

    这导致输出类似于...

    // Hash Codes
    a = 16130931
    b = 26315233
    c = 32716405
    // Deep hash codes
    a = 1250961
    b = 1355
    c = 1250961
    

    【讨论】:

    • 在答案中添加可运行代码的非常好的方法 =) 对于原始数组;但是,Arrays.hashCode 比 Arrays.deepHashCode 更合适。我修改了您的代码并添加了一个单独的答案,该答案表明它仍然为给定的输入提供相同的 hashCodes,以及两者不同时的示例。
    猜你喜欢
    • 2013-10-13
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2010-12-16
    • 2016-03-01
    • 2011-12-14
    • 1970-01-01
    相关资源
    最近更新 更多