【发布时间】:2016-09-08 08:16:17
【问题描述】:
我刚刚意识到使用Stream.reduce(...) 无法实现以下算法来计算流的哈希码。问题是哈希码的初始种子是1,这不是累加器的标识。
List.hashCode() 的算法 :
int hashCode = 1;
for (E e : list)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
您可能会认为以下是正确的,但事实并非如此,尽管如果不拆分流处理它会起作用。
List<Object> list = Arrays.asList(1,null, new Object(),4,5,6);
int hashCode = list.stream().map(Objects::hashCode).reduce(1, (a, b) -> 31 * a + b);
似乎唯一明智的做法是获取Stream 的Iterator 并进行正常的顺序处理或先将其收集到List。
【问题讨论】:
-
问题是你为什么要计算
hash code for a stream。你打算用它做什么? -
听起来像XY problem。 complex datastructure 不实现
hashCode()吗?如果没有,您是否允许实施它?您是否真的需要在流上并行计算此哈希,以便reduce不相关?也许作为最后的手段,你考虑过stream.collect(Collectors.toList()).hashCode()吗? -
所以如果我理解正确,你想知道 2 个对象是否相等,仅基于它们的一部分已被某些
Functions提取/转换的状态? -
针对这个新问题,您能否也更新一下您的问题,以便更多人更容易地帮助您?
-
@Eran:因为我们可以。好吧,至少我喜欢解决问题。 ;^) 而且,谁知道呢,也许在未来,有人真的有一个非常大的列表要并行散列......
标签: java hash java-stream hashcode