我面临以下问题。 One Thread正在构建和更新Tree Object。要验证树,需要计算该树的哈希值。所以第二个Thread会连续计算该树的哈希值。
现在我遇到了以下问题:该树的大小约为300mb,我想确保在计算哈希值时树不会改变,比如拍摄快照并计算它的哈希值。
我的猜测是我有以下两种选择:
是否有一个共同的技巧或模式来拍摄大对象的'快照'而不仅仅是复制它们?
(我的猜测是这会对树对象进行有意义的更改,但我很感激每一个提示。)
提前致谢, flxh
PS:我不知道这个问题是否重要,但我使用的是Java(1.8)
答案 0 :(得分:1)
我认为你既不应该在计算新哈希时阻塞,也不应该复制或拍摄整棵树的快照,特别是如果树需要大约300 MB的内存。
相反,我采取了另一种方法。我使用增量散列函数。我不是这些问题的专家,但到目前为止我所知道的最好的是来自greenrobot common实用程序库的Murmur3F。请检查他们的样品。 Murmur3F
可让您多次调用其update()
方法。然后调用getValue()
来获取实际的哈希值。你可以多次这样做。
因此,每次修改时,我都不会在单独的线程中重新计算整个树的哈希值。使用Murmur3F哈希实现,我会在每次树的更新时使用update()
方法,并在树的getValue()
上使用getHash()
。