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库可以做到这一点?
如果所有类都实现hashCode()(不使用"默认"内存地址哈希码),则可以使用地图hashCode().
这里需要注意的是,如果你ExampleClass没有实现hashCode(),那么相同的项可能在两台不同的机器上有不同的哈希值,这将导致地图的不同哈希值.
澄清:
Map实现了一个hashCode()被定义为总和的它Map.Enytry的hashCode()秒.
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)
这意味着它依赖于ExampleClass的hashCode().
如果ExampleClass确实hashCode()以等于ExampleClasses 的方式实施hashCode(),那么一切都会顺利进行.如果ExampleClass没有实现hashCode(),它将使用Object's hashCode(),这几乎总会给你不同的hashCodes().