繁体   English   中英

我可以将Java的哈希码与javascript的哈希码进行比较吗?

[英]Can I compare a hash code from java with a hash code from 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进行哈希比较来比较树更好的方法呢?

在Javascript中,原始数字不是32位整数,并且变量在任何两种类型之间均不会改变。 它们始终是Number

Number类型的值正好为18437736874454810627(即264−253 + 3),表示IEEE二进制浮点算术标准中指定的双精度64位格式IEEE 754值,除了9007199254740990(即,253-2)IEEE标准的不同“非数字”值在ECMAScript中表示为单个特殊的NaN值。

这意味着不同整数的支持范围基本上是–2 53至2 53

这也是Java的double遵循的相同规范,因此可以与之最准确地比较。

我不知道您的getMostSignificantBitsAsIntgetLeastSignificantBitsAsInt做什么,但是如果他们将Number 解释为32位整数就可以了-即使不是。

如果尚未完成和测试,这可能比它值得的工作还要多,但是您可以使用Javascript的按位运算符 (将其操作数视为32位整数)来完成它,这正是您想要的结果。 (具体来说,他们规范要求在应用运算符之前,需要在每个操作数上调用ToInt32 。)

我将使用这些操作数编写一些方法来实现此目的,为这些方法编写一些测试用例,然后您的方法应该可以工作。 当然,正如您所说,精度至关重要,因此我将对所有零件进行单元测试。


最后一点,您没有说出基本目标是什么,但是可以通过寻找一种“较小的”身份哈希来实现目标吗? 我不愿对具有不稳定基础的算法施加任何压力(关于性能或准确性)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM