定数0x9e3779b9を理解しようとしています。
これはどのようなデータですか? 2進数ではなく、10進数ではありません。これは何ですか?
TEAアルゴリズムで使用される定数です。 ゴールデン番号 から派生したとありますが、ゴールデン番号は1.618ですか?
他の人が言ったように、定数は16進形式の整数です。具体的には、16進形式の32ビット整数です。定数が符号付き整数の場合、0x9e3779b9は2の補数形式の負の10進数の1640531527です。したがって、関連する2つの問題の非整数を処理するように調整された、スケーリングされた整数の小数である可能性があります。
16進数で2の補数の負から正への変換
0x9e3779b9 ⊕ 0xffffffff + 0x00000001 = 0x61C88647 = 1640531527 in decimal
または1の補数演算子〜を使用するC言語ファミリ
~0x9e3779b9 + 0x00000001 = 0x61C88647 = 1640531527 in decimal
バイナリの2の補数の負から正への変換
10011110001101110111100110111001 ⊕ 11111111111111111111111111111111 + 00000000000000000000000000000001 = 01100001110010001000011001000111 = 1640531527 in decimal
私はこのStackOverflowの質問がそれに答えると思います:
https://stackoverflow.com/questions/4948780/magic-numbers-in-boosthash-combine
基本的に、それは次の手順を使用して、黄金比の無理数から導出されるマジックナンバーです。
phi = (1 + sqrt(5)) / 2 = 1,6180339887498948482045868343656
。
その後、それは計算されます2^32 / phi
これは2 654 435 769,4972302964775847707926
。
整数部分のみになるように切り捨てます2 654 435 769
それを16進数に変換すると、9E37 79B9
(Windows電卓ではQword
を選択)
事前に計算された整数であるため、毎回フロートを取得して計算を行うのではなく、その後に行われる各ハッシュの計算を加速します。
表記0x
は 16進数 数値、または基数16の場合です。基数16の数値の利点は、数字の各ペアが1バイトを正確に表すことです。少し練習すれば、2進数を扱ったことがあるとすれば、ビットパターンはほとんど頭に浮かぶでしょう。
数値は、黄金比の16進数表現から得られます。
と同じように 1/4
は0.25
(25/100
)(10進数)は0.4
(4/16
)16進数では、黄金比の小数部分は16進数と10進数で表現が異なります。
分割していません0x9e3779b9
沿って 10^8
、 だが 16^8
(または2/32
)、および0x9e3779b9/0x100000000 = 2654435769/4294967296 ≈ 0.6180339886
他の人がここや https://stackoverflow.com/questions/4948780/magic-numbers-in-boosthash-combine で指摘したように、数値は実際には黄金比から構築されます。
しかし、暗号化関数でpi、phi、eなどの数値が使用される理由には、別の重要な理由があります。もちろん、原則として、「合理的にランダムな」ビットシーケンスは定数として使用できます。しかし、それは関数の作成者をengineeredに値を持っている疑いをかけます。アルゴリズムに特定の弱点(彼だけが知っている)を作成するために、あなたが彼の関数を使用するときに彼が利用できるようにします。
よく知られた「自然な」定数から値を構成することにより、この種の疑いをある程度回避することができます。