:ここ
は既に答え同様の問題です。
まず、ビッグエンディアンを使用してバッファの最初の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ハッシュバッファを返し、バッファ、および次のコードの抜粋に見られるように、その上にハッシュインデックス処理を適用することを要します返されるハッシュインデックスが可能な最大ハッシュ値を超えないようにしてください。
左シフト16ビットは、「0x10000」を乗算することと等価である。私はここで何が欠けていますか? – sqykly
良いキャッチ、私は完全に混乱しています - この時点で私はそれが数を生成するためのいくつかの内部プロトコルだと仮定することができます - おそらくチェックサム番号などのですか? – NadavL
'(uint << 32) - 1'というより意味がありますか?ただの考え – sqykly