Я застрял дома прямо сейчас по той же причине, что и все остальные, и я использую Chord. Я столкнулся с тем, что мне кажется проблемой в статье, и я в замешательстве.
Псевдокод присоединения Chord включает раздел, в котором описывается, как обновить таблицы finger других узлов в сети, как только мы мы создали нашу собственную таблицу пальцев, которая выглядит следующим образом:
n.updateOthers()
for i=1 to m
p = find_predecessor(n - 2^(i-1))
p.update_finger_table(n,i)
n.update_finger_table(s,i)
if s in [n,n.finger[i].node)
n.finger[i].node = s
p = predecessor
p.update_finger_table(s,i)
В случае, если это полезно, для справки об этом можно найти на странице 6 статьи по аккордам, которая является http://nms.lcs.mit.edu/papers/chord.pdf тут.
update_finger_table мне кажется проблемой, а именно то, что диапазон, который он использует, кажется мне неправильным. s, находящееся между n и finger [i], недостаточно, чтобы сделать s правильным значением для finger [i]: s должно быть между finger [i] .start (ie n + 2 ^ (i)), и finger [i], чтобы иметь правильное значение. Я думаю, что, возможно, метод поиска предшественника в updateOthers имеет дело с этим при первом вызове update_finger_table, но в моей реализации это происходит по крайней мере после рекурсивного вызова p.update_finger_table, где вообще нет проверки.
Должен ли псевдокод действительно быть:
n.update_finger_table(s,i)
if s in [n.finger[i].start,n.finger[i].node)
n.finger[i].node = s
p = predecessor
p.update_finger_table(s,i)
Или я что-то неправильно понял?