缓冲区为整数。无法理解这一行代码

时间:2015-12-17 20:12:42

标签: javascript node.js

我正在寻求帮助理解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的目的是什么。

这个模块对我来说非常有趣,并且理解它如何将缓冲区转换为整数的任何帮助都将非常感激!

2 个答案:

答案 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个字节构造一个数字,并将其返回给调用函数。

希望能回答你的问题。

Wikipedia's Big Endian entry

修改

正如有人在评论中指出的那样,我完全错误地认为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