我正在寻求帮助理解npm moudle this line of code中的hash-index。
这个模块的目的是成为一个函数,它通过你传递的第二个参数返回输入mod的sha-1哈希值。
我不明白这个模块中的特定功能是将Buffer作为输入并返回一个整数:
var toNumber = function (buf) {
return buf.readUInt16BE(0) * 0xffffffff + buf.readUInt32BE(2)
}
我似乎无法弄清楚为什么选择缓冲区的特定偏移量以及乘以0xffffffff
的目的是什么。
这个模块对我来说非常有趣,并且理解它如何将缓冲区转换为整数的任何帮助都将非常感激!
答案 0 :(得分:2)
它在缓冲区中打印第一个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,它接受该缓冲区,并在其上应用哈希索引,如以下代码摘录所示:
return toNumber(crypto.createHash('sha1').update(input).digest()) % max
此外,它使用modulu来确保返回的哈希索引不会超过最大可能的哈希值。
答案 1 :(得分:0)
乘以2相当于向左移位1,所以乘以2 ^ 16的目的相当于将位移16次。
这是一个类似的问题已经回答: Bitwise Logic in C