我试图实现Chord协议,以便快速查找小型网络中的某些节点和密钥。我无法弄清楚的是......和弦将节点和键放在一个cirlce上。它们的位置由应用SHA-1散列函数获得的散列值决定。我如何使用这些值进行操作?我是否将它们作为字符串de9f2c7f d25e1b3a fad3e85a 0bd17d9b 100db4b3
进行比较,然后根据"a" < "b" is true
进行比较?或者怎么样?我如何知道密钥是在另一个之前还是之后?
答案 0 :(得分:1)
由于键空间是一个环,单个值不能说比另一个更大,因为如果你绕环走另一条路,则情况正好相反。你可以说一个值是否在一个范围内。在Chord DHT中,每个服务器负责其与其前身之间的值范围内的密钥。
我建议不要使用字符串作为哈希值。您shouldn't use the hashCode
function for distributed systems,但在添加新节点时需要对哈希键进行数学计算。您可以尝试将哈希值转换为BigIntegers。
答案 1 :(得分:0)
sha1哈希值不是字符串,而是非常长的十六进制数字 - 它们通常存储为字符串,因为否则它们需要本机160位数字类型。它们被构建为5个32位十六进制数,然后经常“串联”在一起。
使用sha1字符串作为它们所代表的数字并不难,但需要一个可以处理如此大数字的库(如BigInt或bcmath)。这些库通过从右到左一次计算字符串中一列的数字来工作,就像一个人在使用钢笔和纸张来添加,乘法,除法等时,它们通常具有进行常见数学运算的功能。良好的比较等,并经常把字符串作为参数。此外,请确保在需要从十六进制到十六进制时使用函数转换大数字,否则您的160位十六进制数可能会四舍五入为64位十进制浮点数或类似数据,并且大部分精度都是松散的。
多于/少于比较 用于和弦到数字范围,但是使用模数这样做以便它们“换行”,使[64,2]等范围成为可能。实际的公式是
find_successor(fingers[k] = n + 2^(k-1) mod(2^160))
其中'n'是节点的sha1,'k'是手指编号。
记住,'n'将是十六进制而'k'和'mod(160 ^ 2)'通常是dec,所以这是你需要BigInt hex到BigInt dec的地方。
即使您的编程框架允许您创建这些变量为hex,160特别是dec(字面意思是一个hounded和60个位),此外,围绕'mod(160 ^ 2)包围你的大脑已经够了没有将其可视化为十六进制。将'n'转换为dec而不是将'k'等转换为十六进制,然后使用BigInt lib进行数学运算,包括比较。