我可以将来自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
:
数字类型正好具有 18437736874454810627(即 264−253+3(值,表示 IEEE 二进制浮点运算标准中指定的双精度 64 位格式 IEEE 754 值,只是 IEEE 标准的9007199254740990(即 253−2(不同的"非数字"值在 ECMAScript 中表示为单个特殊 NaN 值。
这意味着非重复整数支持的范围基本上是 –253 到 253。
这与Java的double也符合相同的规范,因此可以最准确地与之进行比较。
我不知道你的getMostSignificantBitsAsInt
和getLeastSignificantBitsAsInt
做什么,但如果他们将数字解释为32位整数,你应该没问题 - 即使它不是。
如果尚未完成和测试,这可能是比它的价值更多的工作,但你可以使用 Javascript 的按位运算符来完成它,这些运算符将它们的操作数视为 32 位整数,这正是您正在寻找的。 (具体而言,它们规范要求在应用运算符之前在每个操作数上调用 ToInt32。
我会使用这些操作数编写一些方法来完成此操作,为这些方法编写一些测试用例,您的方法应该可以工作。 当然,正如你所说,精度非常重要,所以我会对所有部件进行单元测试。
最后,你还没有说出你的根本目标是什么,但你能通过寻找一种"更小"的认同感来实现你的目标吗? 我不想对基础不稳定的算法施加任何形式的压力(关于性能或准确性(。
- 根据选项卡内部的文本链接中的哈希ID动态选择jqueryUI选项卡
- Steam Web API:I'我不知道该如何处理这个看起来像哈希的url来生成图像
- AngularJS:获取链接中没有哈希的查询字符串值
- 如何在Google chrome安全首选项文件中创建扩展安全哈希代码
- 如何在浏览器重新加载时保存位置哈希状态
- jQuery scrollTop-哈希错误
- 动态添加哈希标记;t工作
- 在Javascript中实现对哈希值的暴力攻击
- 如何在JavaScript/Node中计算SHA256哈希和Base64字符串编码
- Node.js字符串中的10位哈希代码
- 如何计算字符串集合(0.5000个元素)的哈希代码
- 如何在哈希更改之前执行代码
- 更改 URL 哈希更改的脚本代码
- 带有哈希密码的代码 PHP 无法工作
- 在Javascript Regex中,如何匹配哈希标签,但不与HTML代码匹配
- 我可以将来自java的哈希代码与来自javascript的哈希代码进行比较吗?
- 检测哈希变化和哈希存在的代码运行副本
- Javascript -检查哈希,忽略下面的分析代码
- JavaScript根据实数和整数计算哈希代码
- 我已经编写了自己的JavaScript代码库,但我仍然无法生成种子信息哈希