我正在寻找帮助来了解npm moudle hash-index中的这一行代码。
该模块的目的是成为一个函数,该函数通过您传递的第二个参数返回输入mod的sha-1哈希。
我不理解此模块中的特定功能,该功能将Buffer作为输入并返回整数:
var toNumber = function (buf) {
return buf.readUInt16BE(0) * 0xffffffff + buf.readUInt32BE(2)
}
我似乎无法弄清楚为什么选择了缓冲区的那些特定偏移量以及乘以的目的是什么0xffffffff
。
这个模块对我来说真的很有趣,如果您对理解如何将缓冲区转换为整数有任何帮助,将不胜感激!
它在缓冲区中打印第一个UINT32(无符号整数32位)。
首先,它使用Big Endian读取缓冲区的前两个字节(UINT16),然后将其乘以0xFFFFFFFF。
然后,它读取缓冲区中的后四个字节(UINT32),并将其添加到乘数中-得出一个由缓冲区的前6个字节构成的数字。
示例:考虑[Buffer BB AA CC CC DD ...]
0xbb * 0xffffffff = 0xbaffffff45
0xbaffffff45 + 0xaaccccdd = 0xbbaacccc22
关于偏移量,它选择了这种方式:
第一次,它从字节0读取到字节1(隐式键入-UINT16)
第二次,它从字节2读取到字节5(转换为类型-UINT32)
综上所述,它使用大尾数表示法从缓冲区的前6个字节构造一个数字,并将其返回给调用函数。
希望能回答您的问题。
编辑
正如有人在评论中指出的那样,我完全错误地认为0xFFFFFFFF是32的左移,这只是一个数字乘法-我假设这是一种内部协议,用于计算符合他们期望的正确合法缓冲区头。
编辑2
在原始上下文中查看了函数之后,我得出了以下结论:
此函数是哈希流的一部分,它以这种方式工作:
主流程接收字符串输入和哈希输出的最大数量,然后接收字符串输入,并将其插入SHA-1哈希函数中。
SHA-1哈希返回一个Buffer,它接受该Buffer,并对其应用哈希索引,如以下代码摘录所示:
return toNumber(crypto.createHash('sha1').update(input).digest()) % max
另外,它使用模数来确保返回的哈希索引不超过最大可能的哈希值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句