我可以比较java的哈希代码和javascript的哈希代码吗?
我在客户端有一个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进行散列来比较树
# 1 楼答案
在Javascript中,基元数不是32位整数,变量在任何两种类型之间都不会改变;他们总是^{}s :
这意味着不同整数的支持范围基本上是-253到253
这与Java's double也符合同样的规范,因此可以最准确地与之进行比较
我不知道你的
getMostSignificantBitsAsInt
和getLeastSignificantBitsAsInt
是怎么做的,但是如果他们把这个数字解释成一个32位整数,即使它不是,你也应该没事如果还没有完成和测试的话,这可能会比它的价值更大,但您可以使用Javascript的bitwise operators来完成它,它将操作数视为32位整数,这正是您要寻找的。(具体地说,它们要求在应用运算符之前调用每个操作数上的ToInt32。)
我将使用这些操作数编写一些方法来实现这一点,为这些方法编写一些测试用例,您的方法应该可以工作。当然,正如你所说的,精度非常重要,所以我会对所有零件进行单元测试
最后一点,你还没有说你的潜在目标是什么,但你能通过寻找一种“较小”的身份感来实现你的目标吗?我不想对一个基础不稳固的算法施加任何压力(关于性能或准确性)