JSFiddle - React, Tailwind, and code Playground
by Kamal Kumawat
JavaScript
var nodes = [3, 15, 26, 47, 51, 62];
var fingerSize = 6;
var totalNodes = Math.pow(2, fingerSize);
var cyclicNodes = [...nodes];
/* nodes.forEach((val, k) => {
cyclicNodes[cyclicNodes.length] = totalNodes + val;
}) */
function createFingerTable(nodes, fingerSize) {
var fingerTable = {};
nodes.forEach((node, key) => {
let table = [];
for (var i = 1; i <= fingerSize; i++) {
let val = node + Math.pow(2, i - 1);
while(val > nodes[nodes.length-1]){
val -= Math.pow(2,fingerSize);
}
let selectedNode;
for (var j = 0; j < cyclicNodes.length; j++) {
if (val <= cyclicNodes[j]) {
selectedNode = cyclicNodes[j];
break;
}
}
table.push(selectedNode)
}
fingerTable[node] = table;
});
return fingerTable;
}
var fingerTable = createFingerTable(nodes, fingerSize)
console.log("table===>>", fingerTable);
function fingerHop(source, key, target = []) {
console.log("total nodesssss", source, totalNodes);
if (source >= totalNodes) {
source = source - totalNodes;
key = key - totalNodes;
}
target.push(source);
let fingerTabSource = fingerTable[source]
if (key < source) key = key + totalNodes
if (key <= fingerTabSource[0]) {
if(fingerTabSource[0] >= totalNodes){
target.push(fingerTabSource[0]-totalNodes);
}else{
target.push(fingerTabSource[0]);
}
return target;
} else {
let i = fingerTabSource.length - 1
while (i > 0) {
if (key > fingerTabSource[i]) {
return fingerHop(fingerTabSource[i], key, target);
i = 0;
} else {
i--;
}
}
}
}