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--;
      }
    }
  }
}