我已經在這個主題上回顧了許多文檔,但是有些東西不完全清楚。例如位洪流文件(http://www.bittorrent.org/beps/bep_0005.html)指出在洪流kademlia路由表上實現find節點
路由表被細分成「桶」,每個覆蓋的空間的一部分 。一個空表有一個ID爲 min = 0,max = 2^160的桶。當具有ID「N」的節點插入到 表中時,它被放置在具有最大= N <最大的桶內。 空表只有一個存儲桶,因此任何節點都必須適合它。每個 存儲桶只能存放八個K節點,然後才能變爲「滿」。 當一個桶充滿已知的好節點時,除非我們自己的節點ID落入該桶的範圍內,否則不會再添加更多節點 。在那個 的情況下,該桶被兩個新桶替換,每個桶都有舊桶的 範圍的一半,舊桶的節點分配到兩個新桶中的 。對於只有一個 存儲桶的新表格,整個存儲桶始終會分成兩個新存儲桶,分別覆蓋 ,範圍爲0..2^159和2^159..2^160。
它與其他有關kademlia路由表的文檔有所不同,其中桶根據節點id的位前綴排列,但還有另一個令人困惑的事情。當我們回覆「查找節點」請求時,我們必須使用XOR操作找到8個最接近請求節點的節點。我看到一些實現只是通過執行異或操作的路由表中的每個項目,因此找到了8個最接近的項目。在我看來,CPU太浪費了。
一切都已在桶中。即使我們使用torrent文檔系統的建議,我們也可以更快地找到可能包含請求節點ID的桶,只需枚舉桶並檢查桶上的最小和最大數量即可。然後潛在的那個桶應該包含關閉的節點,但它們是最接近最近的節點,而不是XOR最近的節點(據我所知),這有點不同,但有點相似。
我跑了一個簡單的測試,使用從0到99的數字,我想找到8個XOR最接近的數字,他們在尋找的數字附近但不是靠近它。現在,考慮我們的桶,我想有可能桶中的所有節點ID都是最小的異常。所以,舉例來說,如果我們拿這個桶,從左邊和右邊一個拿一個,然後搜索XOR最接近的節點id,我們將找到我們正在尋找的東西,並且沒有必要通過路由中的所有節點表。
我是對的還是我錯過了什麼?
經過一些測試我發現我以前的答案實際上是不正確的,更新它以反映正確和經過測試的算法。 – the8472