通过散列比较java地图

Her*_*che 0 java collections hash comparison compare

我想用简单的哈希比较两个Java Map.

每个对象都在不同的计算机上,因此通过网络发送哈希将比发送整个对象进行比较更便宜.

例如,我有两个HashMapExampleClass

Map<String,ExampleClass> One=new ...;

Map<String,ExampleClass> Other=new ...;
Run Code Online (Sandbox Code Playgroud)

我不需要确定所有元素都是相等的, 这足以让我信任哈希.

我正要在每一侧进行迭代并创建一个"自制哈希",然后将其发送到网络,最后比较一个int或类似的东西.

如果每次从Collection中添加或删除对象时计算这个"哈希"会很好,这样可以避免迭代整个对象.我必须封装每次添加/删除Map.有没有Java库可以做到这一点?

tru*_*ity 6

如果所有类都实现hashCode()(不使用"默认"内存地址哈希码),则可以使用地图hashCode().

这里需要注意的是,如果你ExampleClass没有实现hashCode(),那么相同的项可能在两台不同的机器上有不同的哈希值,这将导致地图的不同哈希值.


澄清:

Map实现了一个hashCode()被定义为总和的它Map.EnytryhashCode()秒.

Map.Entry'shashCode()被定义为键的xorhashCode()和值的xorhashCode().你的密钥是Strings - 它们有一个很好的定义hashCode()(两个相等的字符串总是相同hashCode()).您的值是ExampleClass实例 - 它们还需要明确定义hashCode().

总之,包含的地图{ s1 -> ec1, s2 -> ec2 }将具有等于的哈希码:

(s1.hashCode() ^ ec1.hashCode()) + (s2.hashCode() ^ ec2.hashCode())
Run Code Online (Sandbox Code Playgroud)

这意味着它依赖于ExampleClasshashCode().

如果ExampleClass确实hashCode()以等于ExampleClasses 的方式实施hashCode(),那么一切都会顺利进行.如果ExampleClass没有实现hashCode(),它将使用Object's hashCode(),这几乎总会给你不同的hashCodes().