我有一棵樹在客戶端,在javascript:我可以比較來自java的哈希碼和來自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代碼無效。也許你的意思是'var'而不是'long'? – duskwuff
謝謝,修復。我很笨,並沒有嘗試運行它。我現在運行它只是爲了檢查。 – Verdagon
作爲一個方面說明,你會意識到,如果樹中的某些節點在其樹中改變其位置,但不改變它們的UUID;例如兩個節點交換 - 然後這個更改不會顯示在客戶端,對吧? –