有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

我可以比较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) 个答案

  1. # 1 楼答案

    在Javascript中,基元数不是32位整数,变量在任何两种类型之间都不会改变;他们总是^{}s

    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是怎么做的,但是如果他们把这个数字解释成一个32位整数,即使它不是,你也应该没事

    如果还没有完成和测试的话,这可能会比它的价值更大,但您可以使用Javascript的bitwise operators来完成它,它将操作数视为32位整数,这正是您要寻找的。(具体地说,它们要求在应用运算符之前调用每个操作数上的ToInt32。)

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


    最后一点,你还没有说你的潜在目标是什么,但你能通过寻找一种“较小”的身份感来实现你的目标吗?我不想对一个基础不稳固的算法施加任何压力(关于性能或准确性)