我可以将来自java的哈希代码与来自javascript的哈希代码进行比较吗?

Can I compare a hash code from java with a hash code from javascript?

本文关键字:代码 哈希 比较 将来 java 我可以 javascript      更新时间:2023-09-26

我在客户端中有一棵树,在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散列来比较树更好的方法?

在 Javascript 中,基元数不是 32 位整数,变量不会在任何两种类型之间变化;它们总是Number

数字类型正好具有 18437736874454810627(即 264−253+3(值,表示 IEEE 二进制浮点运算标准中指定的双精度 64 位格式 IEEE 754 值,只是 IEEE 标准的9007199254740990(即 253−2(不同的"非数字"值在 ECMAScript 中表示为单个特殊 NaN 值。

这意味着非重复整数支持的范围基本上是 –253 到 253

这与Java的double也符合相同的规范,因此可以最准确地与之进行比较。

我不知道你的getMostSignificantBitsAsIntgetLeastSignificantBitsAsInt做什么,但如果他们将数字解释为32位整数,你应该没问题 - 即使它不是。

如果尚未完成和测试,这可能是比它的价值更多的工作,但你可以使用 Javascript 的按位运算符来完成它,这些运算符将它们的操作数视为 32 位整数,这正是您正在寻找的。 (具体而言,它们规范要求在应用运算符之前在每个操作数上调用 ToInt32。

我会使用这些操作数编写一些方法来完成此操作,为这些方法编写一些测试用例,您的方法应该可以工作。 当然,正如你所说,精度非常重要,所以我会对所有部件进行单元测试。


最后,你还没有说出你的根本目标是什么,但你能通过寻找一种"更小"的认同感来实现你的目标吗? 我不想对基础不稳定的算法施加任何形式的压力(关于性能或准确性(。