缓冲区为整数。 无法理解这行代码
我正在寻找帮助理解npm moudle hash-index中的这一行代码 。
这个模块的目的是通过你传递的第二个参数来返回input模块的sha-1哈希函数。
我不明白的这个模块中的具体function是以Buffer作为input并返回一个整数:
var toNumber = function (buf) { return buf.readUInt16BE(0) * 0xffffffff + buf.readUInt32BE(2) }
我似乎无法弄清楚为什么select这些缓冲区的特定偏移量以及乘以0xffffffff
的目的是什么。
这个模块对我来说真的很有趣,在理解它如何将缓冲区转换为整数方面的任何帮助将不胜感激!
它在缓冲区中打印第一个UINT32(无符号整数32位)。
首先,它使用Big Endian读取缓冲区的前两个字节(UINT16),然后将其乘以0xFFFFFFFF。
然后,它读取缓冲区中的后四个字节(UINT32),并将其添加到相乘的数字 – 从缓冲区的前6个字节中产生一个数字。
示例:考虑[缓冲区BB AA CC CC DD …]
0xbb * 0xffffffff = 0xbaffffff45 0xbaffffff45 + 0xaaccccdd = 0xbbaacccc22
关于偏移量,它select了这种方式:
第一次,它从字节0到字节1 (转换为键入 – UINT16)
第二次,它从字节2读取到字节5 (转换为types – UINT32)
所以总结一下,它使用大端符号从缓冲区的前6个字节构造一个数字,并将其返回给调用函数。
希望这是你的问题的答案。
维基百科的Big Endian条目
编辑
正如有人在评论中指出的,我完全错误的是0xFFFFFFFF是左移32,这只是一个数字乘法 – 我假设它是某种内部协议来计算一个正确的合法缓冲区头符合他们所期望的。
编辑2
在原始上下文中查看函数后,我得出这个结论:
这个函数是散列stream程的一部分,它的工作方式如下:
主stream接收一个stringinput和一个最大数量的散列输出,然后接受stringinput,将其插入到SHA-1哈希函数中。
SHA-1散列返回一个缓冲区,它使用该缓冲区,并对其应用散列索引,如以下代码片段所示:
return toNumber(crypto.createHash('sha1').update(input).digest()) % max
此外,它使用模糊来确保返回的散列索引不超过最大可能的散列。
乘以2相当于向左移位1,所以乘以2 ^ 16的目的相当于将位左移16次。
这里有一个类似的问题已经回答了: C中的按位逻辑