/** * Finds the index of the k-bucket whose key range contains a given {@link Hash}. * This method does a binary search "by hand" because <code>Collections.binarySearch()<code> * cannot be used to search for a <code>Hash</code> in a <code>List<KBucket></code>. * @param key * @return */ private int getBucketIndex(Hash key) { if (kBuckets.size() == 1) return 0; // initially, the search interval is 0..n-1 int lowIndex = 0; int highIndex = kBuckets.size() - 1; BigInteger keyValue = new BigInteger(1, key.getData()); while (lowIndex < highIndex) { int centerIndex = (highIndex + lowIndex) / 2; if (keyValue.compareTo(kBuckets.get(centerIndex).getStartId()) < 0) highIndex = centerIndex - 1; else if (keyValue.compareTo(kBuckets.get(centerIndex).getEndId()) >= 0) lowIndex = centerIndex + 1; else return centerIndex; } return lowIndex; }
private void refresh(KBucket bucket) throws InterruptedException { Hash key = createRandomHash(bucket.getStartId(), bucket.getEndId()); getClosestNodes(key); }
assertEquals(bucket1.getEndId(), bucket2.getStartId()); BigInteger peerId = new BigInteger(1, peer.calculateHash().getData()); assertTrue(bucket.getStartId().compareTo(peerId) <= 0); assertTrue(bucket.getEndId().compareTo(peerId) >= 0); previousBit = currentBit; else assertEquals("Bit " + bitIndex + " in peer ID " + peerId + " should be " + previousBit + "; bucket start = " + bucket.getStartId() + ", bucket end = " + bucket.getEndId(), previousBit, currentBit);
bucketSizes.set(i, bucketSizes.get(i)-1); BigInteger startId = bucket.getStartId(); BigInteger endId = bucket.getEndId(); assertTrue("Peer is in the wrong bucket: peer id=" + peerId + ", bucket start=" + startId + " bucket end=" + endId, startId.compareTo(peerId)<=0 && endId.compareTo(peerId)>=0);