web-dev-qa-db-ja.com

TEAアルゴリズム定数0x9e3779b9は黄金比から派生すると言われていますが、黄金数は1.618ですか?

定数0x9e3779b9を理解しようとしています。

これはどのようなデータですか? 2進数ではなく、10進数ではありません。これは何ですか?

TEAアルゴリズムで使用される定数です。 ゴールデン番号 から派生したとありますが、ゴールデン番号は1.618ですか?

7
pandr01d

他の人が言ったように、定数は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
11
bit-twiddler

私はこのStackOverflowの質問がそれに答えると思います:

https://stackoverflow.com/questions/4948780/magic-numbers-in-boosthash-combine

基本的に、それは次の手順を使用して、黄金比の無理数から導出されるマジックナンバーです。

  1. phi = (1 + sqrt(5)) / 2 = 1,6180339887498948482045868343656

  2. その後、それは計算されます2^32 / phiこれは2 654 435 769,4972302964775847707926

  3. 整数部分のみになるように切り捨てます2 654 435 769

  4. それを16進数に変換すると、9E37 79B9(Windows電卓ではQwordを選択)

事前に計算された整数であるため、毎回フロートを取得して計算を行うのではなく、その後に行われる各ハッシュの計算を加速します。

表記0x16進数 数値、または基数16の場合です。基数16の数値の利点は、数字の各ペアが1バイトを正確に表すことです。少し練習すれば、2進数を扱ったことがあるとすれば、ビットパターンはほとんど頭に浮かぶでしょう。

36
Berin Loritsch

数値は、黄金比の16進数表現から得られます。

と同じように 1/40.2525/100)(10進数)は0.44/16)16進数では、黄金比の小数部分は16進数と10進数で表現が異なります。

分割していません0x9e3779b9 沿って 10^8、 だが 16^8(または2/32)、および0x9e3779b9/0x100000000 = 2654435769/4294967296 ≈ 0.6180339886

3
SomeRandomGuy

他の人がここや https://stackoverflow.com/questions/4948780/magic-numbers-in-boosthash-combine で指摘したように、数値は実際には黄金比から構築されます。

しかし、暗号化関数でpi、phi、eなどの数値が使用される理由には、別の重要な理由があります。もちろん、原則として、「合理的にランダムな」ビットシーケンスは定数として使用できます。しかし、それは関数の作成者をengineeredに値を持っている疑いをかけます。アルゴリズムに特定の弱点(彼だけが知っている)を作成するために、あなたが彼の関数を使用するときに彼が利用できるようにします。

よく知られた「自然な」定数から値を構成することにより、この種の疑いをある程度回避することができます。

0
mindriot