gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:50:41 25 4
gpt4 key购买 nike

我在客户端中有一棵树,在 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 始终处理整数,并且从不将任何内容转换为 float 。如果我继续这样使用 xor,那么它永远不会变成 float ,是不是可以假设?

或者也许有比使用 xor 散列来比较树更好的方法?

最佳答案

在 Javascript 中,原始数字不是 32 位整数,变量在任何两种类型之间都不会改变;他们总是Numbers :

The Number type has exactly 18437736874454810627 (that is, 264−253+3) values, representing the double-precision 64-bit format IEEE 754 values as specified in the IEEE Standard for Binary Floating-Point Arithmetic, except that the 9007199254740990 (that is, 253−2) distinct “Not-a-Number” values of the IEEE Standard are represented in ECMAScript as a single special NaN value.

这意味着不同整数的支持范围基本上是 –253 到 253

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

我不知道你的 getMostSignificantBitsAsIntgetLeastSignificantBitsAsInt 做了什么,但如果他们解释 Number 就好像它是一个 32 位整数——即使它不是。

如果尚未完成和测试,这可能会超出其值(value),但您可以使用 Javascript 的 bitwise operators 来完成它,将它们的操作数视为 32 位整数,这正是您要查找的内容。 (具体来说,他们规范要求在应用运算符之前对每个操作数调用 ToInt32。)

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


最后一点,您没有说明您的基本目标是什么,但是您能否通过寻找“较小”的身份认同感来散列来实现您的目标?我不愿意对基础不稳定的算法施加任何压力(关于性能或准确性)。

关于java - 我可以将来自 java 的哈希码与来自 javascript 的哈希码进行比较吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19106959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com