[英]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遵循的相同规范,因此可以与之最准确地比较。
我不知道您的getMostSignificantBitsAsInt
和getLeastSignificantBitsAsInt
做什么,但是如果他们将Number 解释为32位整数就可以了-即使不是。
如果尚未完成和测试,这可能比它值得的工作还要多,但是您可以使用Javascript的按位运算符 (将其操作数视为32位整数)来完成它,这正是您想要的结果。 (具体来说,他们规范要求在应用运算符之前,需要在每个操作数上调用ToInt32 。)
我将使用这些操作数编写一些方法来实现此目的,为这些方法编写一些测试用例,然后您的方法应该可以工作。 当然,正如您所说,精度至关重要,因此我将对所有零件进行单元测试。
最后一点,您没有说出基本目标是什么,但是可以通过寻找一种“较小的”身份哈希来实现目标吗? 我不愿对具有不稳定基础的算法施加任何压力(关于性能或准确性)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.