mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-02-02 11:04:00 +01:00
find multiple closest hashes
This commit is contained in:
parent
ce05cce331
commit
eaca435a5b
|
@ -205,6 +205,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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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…
Reference in a new issue