2015-12-17 10 views
5

this line of codeをnpm moudle hash-indexで理解するのに役立つヘルプが必要です。整数へのバッファ。このコード行を理解できない

このモジュールの目的は、渡された2番目の引数によって入力modのsha-1ハッシュを返す関数になります。私は理解していない、このモジュールで

特定の関数は、入力としてバッファを受け取り、整数を返します。このいずれかになります。

var toNumber = function (buf) { 
    return buf.readUInt16BE(0) * 0xffffffff + buf.readUInt32BE(2) 
} 

私はなぜそれらの特定のオフセットを見つけ出すように見えることはできませんバッファが選択され、0xffffffffで乗算の目的は何ですか。

このモジュールは本当に面白いですし、バッファを整数に変換する方法を理解する助けとなるでしょう。

答えて

2

:ここ

は既に答え同様の問題です。

まず、ビッグエンディアンを使用してバッファの最初の2バイト(UINT16)を読み取り、それに0xFFFFFFFFを掛けます。

次に、バッファ内の2番目の4バイト(UINT32)を読み出し、それを乗算した数に加算すると、バッファの最初の6バイトから構成された番号になります。

例:[バッファBB AA CCはCCのDD ...]

0xbb * 0xffffffff = 0xbaffffff45 
0xbaffffff45 + 0xaaccccdd = 0xbbaacccc22 

とオフセットについてを考えてみましょう、それはその方法を選んだ:

まず時間が、それはバイトからの読み込みバイト(入力する隠れ家 - UINT16)を

二度目は、5バイトをバイトから読み出します(タイプに変換する - UINT32)

これを要約すると、ビッグエンディアン表記を使用してバッファの最初の6バイトから数値を作成し、それを呼び出し関数に返します。

あなたの質問にお答えします。

Wikipedia's Big Endian entry

EDIT

誰かがコメントで指摘したように、私はそれだけの数の掛け算だ、0xFFFFFFFFには32の左シフトであることについては全く間違っていた - 私はそれはいくつかの種類だと仮定しています期待どおりの合法的なバッファヘッダーを計算します。

EDIT 2

元のコンテキストで関数に見た後、私はこの結論に来ている:

この関数は、ハッシュ・フローの一部であり、それはそのように動作します:

メインフローは、ハッシュ出力の文字列入力と最大番号を受け取り、文字列入力を受け取り、SHA-1ハッシュ関数でそれを接続します。

return toNumber(crypto.createHash('sha1').update(input).digest()) % max 

また、それがmoduluを使用する:

SHA-1ハッシュバッファを返し、バッファ、および次のコードの抜粋に見られるように、その上にハッシュインデックス処理を適用することを要します返されるハッシュインデックスが可能な最大ハッシュ値を超えないようにしてください。

+2

左シフト16ビットは、「0x10000」を乗算することと等価である。私はここで何が欠けていますか? – sqykly

+0

良いキャッチ、私は完全に混乱しています - この時点で私はそれが数を生成するためのいくつかの内部プロトコルだと仮定することができます - おそらくチェックサム番号などのですか? – NadavL

+0

'(uint << 32) - 1'というより意味がありますか?ただの考え – sqykly

0

2を掛けることは、ビットを左に1シフトすることに相当するため、2^16を乗算する目的は、ビットを16回左にシフトすることに相当します。これは、バッファ内の最初のUINT32(符号なし整数32ビット)を印刷

Bitwise Logic in C
+0

「0xFFFFFFFF」は32ビットではありませんか? – MinusFour

+0

確かにそうです。元の質問の変数は、わずか16ビット幅であるが、 –

関連する問題