Browse Source

find multiple closest hashes

pull/1883/head
orignal 2 years ago
parent
commit
eaca435a5b
  1. 33
      libi2pd/KadDHT.cpp
  2. 3
      libi2pd/KadDHT.h

33
libi2pd/KadDHT.cpp

@ -206,6 +206,39 @@ namespace data
return nullptr; return nullptr;
} }
std::vector<IdentHash *> DHTTable::FindClosest (const IdentHash& h, size_t num)
{
std::vector<IdentHash *> vec;
if (num > 0)
FindClosest (h, num, m_Root, 0, vec);
return vec;
}
void DHTTable::FindClosest (const IdentHash& h, size_t num, DHTNode * root, int level, std::vector<IdentHash *>& hashes)
{
if (hashes.size () >= num) return;
if (root->hash)
{
hashes.push_back (root->hash);
return;
}
int bit = h.GetBit (level);
if (bit)
{
if (root->one)
FindClosest (h, num, root->one, level + 1, hashes);
if (hashes.size () < num && root->zero)
FindClosest (h, num, root->zero, level + 1, hashes);
}
else
{
if (root->zero)
FindClosest (h, num, root->zero, level + 1, hashes);
if (hashes.size () < num && root->one)
FindClosest (h, num, root->one, level + 1, hashes);
}
}
void DHTTable::Print (std::stringstream& s) void DHTTable::Print (std::stringstream& s)
{ {
Print (s, m_Root, 0); Print (s, m_Root, 0);

3
libi2pd/KadDHT.h

@ -11,6 +11,7 @@
#define KADDHT_H__ #define KADDHT_H__
#include <memory> #include <memory>
#include <vector>
#include <sstream> #include <sstream>
#include "Identity.h" #include "Identity.h"
@ -42,6 +43,7 @@ namespace data
DHTNode * Insert (const IdentHash& h); DHTNode * Insert (const IdentHash& h);
bool Remove (const IdentHash& h); bool Remove (const IdentHash& h);
IdentHash * FindClosest (const IdentHash& h); IdentHash * FindClosest (const IdentHash& h);
std::vector<IdentHash *> FindClosest (const IdentHash& h, size_t num);
void Print (std::stringstream& s); void Print (std::stringstream& s);
size_t GetSize () const { return m_Size; }; size_t GetSize () const { return m_Size; };
@ -51,6 +53,7 @@ namespace data
DHTNode * Insert (IdentHash * h, DHTNode * root, int level); // recursive DHTNode * Insert (IdentHash * h, DHTNode * root, int level); // recursive
bool Remove (const IdentHash& h, DHTNode * root, int level); bool Remove (const IdentHash& h, DHTNode * root, int level);
IdentHash * FindClosest (const IdentHash& h, DHTNode * root, int level); IdentHash * FindClosest (const IdentHash& h, DHTNode * root, int level);
void FindClosest (const IdentHash& h, size_t num, DHTNode * root, int level, std::vector<IdentHash *>& hashes);
void Print (std::stringstream& s, DHTNode * root, int level); void Print (std::stringstream& s, DHTNode * root, int level);
private: private:

Loading…
Cancel
Save