我在客户端有一棵树,在 javascript 中:
function Node(uuid, someData, versionNum) {
this.uuid = uuid;
this.someData = someData;
this.versionNum = versionNum;
this.childNodes = [];
}
和服务器中的同一棵树,在java中:
public class Node {
UUID uuid;
String someData;
int versionNum;
List<Node> childNodes;
}
客户端将每五秒向服务器发送一个请求,请求树的哈希值。这个想法是树的哈希将像这样递归计算:
public static long hashSubtree(Node node) {
long hash = node.uuid.getMostSignificantBits() ^ node.uuid.getLeastSignificantBits() ^ node.versionNum;
for (Node childNode : node.childNodes)
hash ^= hashSubtree(childNode);
return hash;
}
在客户端上,一旦它收到来自服务器的响应,使用服务器计算的哈希值,客户端将计算其本地树的自己的哈希值:
function hashSubtree(node) {
var hash = getMostSignificantBitsAsInt(node.uuid) ^ getLeastSignificantBitsAsInt(node.uuid) ^ node.versionNum;
for (var i = 0; i < node.childNodes.length; i++)
hash ^= hashSubtree(node.childNodes[i]);
return hash;
}
然后客户端将比较两个哈希码。如果两个哈希码不同,则客户端与服务器不同步,将请求整个树。
问题:
由于精度绝对重要,我需要确保 javascript 始终处理整数,并且永远不会将任何内容转换为浮点数。假设如果我继续像这样使用 xor,那么它永远不会变成浮点数是否可以保存?
或者也许有比使用 xor 散列来比较树更好的方法?