Sto cercando di capire una costante 0x9e3779b9.
Che tipo di dati è questo? Non è binario, non decimale, che cos'è questo?
È una costante utilizzata nell'algoritmo TEA. Dice che è derivato dal numero dorato , ma il numero d'oro è 1.618?
Sto cercando di capire una costante 0x9e3779b9.
Che tipo di dati è questo? Non è binario, non decimale, che cos'è questo?
È una costante utilizzata nell'algoritmo TEA. Dice che è derivato dal numero dorato , ma il numero d'oro è 1.618?
Come altri hanno già detto, la costante è un numero intero in forma esadecimale. In particolare, è un numero intero a 32 bit in forma esadecimale. Se la costante è un intero con segno, 0x9e3779b9 è decimale 1640531527 negativo nella forma a complemento a due; pertanto, può essere una frazione intera ridimensionata che è stata adattata per gestire non-integrale di 2 problemi correlati.
Conversione da negativo a positivo del complemento a due in esadecimale
0x9e3779b9 ⊕ 0xffffffff + 0x00000001 = 0x61C88647 = 1640531527 in decimal
o usando l'operatore complemento 1 di ~ nella famiglia di lingue C
~0x9e3779b9 + 0x00000001 = 0x61C88647 = 1640531527 in decimal
La conversione da negativo a positivo del complemento a due in binario
10011110001101110111100110111001 ⊕ 11111111111111111111111111111111 + 00000000000000000000000000000001 = 01100001110010001000011001000111 = 1640531527 in decimal
Penso che questa domanda StackOverflow risponda:
Essenzialmente, si tratta di un numero magico, derivato dal numero irrazionale del Golden Ratio, che utilizza i passaggi:
phi = (1 + sqrt(5)) / 2 = 1,6180339887498948482045868343656
.
Successivamente, viene calcolato 2^32 / phi
che risulta in 2 654 435 769,4972302964775847707926
.
Tronca di avere solo la sua parte intera 2 654 435 769
Converti in esadecimale e otterrete 9E37 79B9
(In Windows calcolatrice scegliere Qword
)
Essendo esso un intero pre-calcolata, al posto di un prendere un galleggiante ogni tempo e fare il calcolo, si accelera il calcolo di ogni hash fatto dopo.
La notazione 0x
è un numero esadecimale , o base 16. Il vantaggio di una base 16 numero è che ogni coppia di cifre rappresenta esattamente un byte. Dato un po 'di pratica, puoi quasi vedere la sequenza di bit nella tua mente, supponendo che tu abbia mai lavorato con i numeri binari.
Il numero deriva dalla rappresentazione esadecimale del rapporto aureo.
Proprio come 1/4
è 0.25
( 25/100
) in decimale è 0.4
( 4/16
) in esadecimale, la parte frazionaria del rapporto aureo ha una rappresentazione diversa in esagono che in decimale.
Non stai dividendo 0x9e3779b9
per 10^8
, ma 16^8
(o 2/32
) e 0x9e3779b9/0x100000000 = 2654435769/4294967296 ≈ 0.6180339886
Come altri hanno sottolineato qui e su link , il numero è effettivamente costruito da la sezione aurea.
Ma c'è un altro motivo importante per cui perché numeri come pi, phi o e sono usati in funzioni crittografiche. Naturalmente, in linea di principio, qualsiasi sequenza di bit "ragionevolmente casuale" potrebbe essere utilizzata come costante. Ma mette il creatore della funzione sotto sospetto di avere ingegnerizzato il valore, ad es. per creare una particolare debolezza nell'algoritmo (noto solo a lui) che può quindi sfruttare quando si utilizza la sua funzione.
Costruendo il valore da costanti "naturali" ben conosciute, questo tipo di sospetto può essere evitato in una certa misura.
Leggi altre domande sui tag algorithms math