Note di implementazione MD5

1

Durante il passaggio di RFC1321 , mi sono imbattuto nel seguente paragrafo:

   This step uses a 64-element table T[1 ... 64] constructed from the
   sine function. Let T[i] denote the i-th element of the table, which
   is equal to the integer part of 4294967296 times abs(sin(i)), where i
   is in radians. The elements of the table are given in the appendix.

Da quanto ho capito dal paragrafo, significa

T[i] = Integer_part(4294967296 times abs(sin(i)))

Sappiamo che quanto segue è vero per tutto x :

0 <= sin(x) <= 1

Poiché i è un numero intero, abs(sin(i)) potrebbe essere molto 0 per tutti i valori di i .

Ciò significa che la tabella conterrà tutti i valori zero ( 4294967296 volte 0 è 0 ). Nell'implementazione, questo non è vero. Perché è così?
L'appendice contiene solo i valori non elaborati dopo il calcolo. Non è così mostra come è derivato dalla funzione seno.

    
posta vaasu 05.07.2011 - 11:57
fonte

4 risposte

8

Sembra che tu stia assumendo che dal momento che stanno usando un numero intero come input a sin , che l' output sarà anche un intero. Anche questo sembra essere errato. L'intento sembra essere che i inizierà come un intero. Questo intero verrà passato a sin . In un linguaggio come C o C ++ (ad esempio) verrà convertito in virgola mobile in quel processo. Il risultato sarà anche a virgola mobile. Il valore assoluto di quel risultato in virgola mobile sarà moltiplicato per 2 32 , e quindi la parte intera di quel prodotto inserita nella tabella.

Espresso in C (ad esempio), dovresti generare la tabella in questo modo:

#include <math.h>

int main() { 
    int i;
    for (i=1; i<65; i++)
        printf("0x%x\n", (unsigned int)(fabs(sin(i)*4294967296UL)));
    return 0;
}

Non ho controllato tutti i valori, ma l'esecuzione di questo sulla mia macchina sembra produrre valori corrispondenti per i primi valori, gli ultimi valori e alcuni controlli spot tra.

    
risposta data 05.07.2011 - 13:01
fonte
7

Innanzitutto, sin (x) ha valori da -1 a 1, non da 0 a 1.

Gli unici valori positivi di x per i quali sin (x) ha valore di 0 sono multipli di π . π è un numero irrazionale, nessun intero sarà mai multiplo di π

In effetti per valori interi positivi di x , è vero che 0 < abs (sin (x)) < 1.

La parte intera di 4294967296 volte il numero compreso tra 0 e 1 esclusivo, è un numero intero compreso tra 1 e 4294967295 (incluso).

    
risposta data 05.07.2011 - 12:48
fonte
2

Since i is an integer, abs(sin(i)) may very well be 0 for all values of i.

Perché la pensi esattamente così?

abs(sin(1)); 0.8414709848079

abs(sin(2)); 0.90929742682568

abs(sin(3)); 0.14112000805987

abs(sin(4)); 0.75680249530793

    
risposta data 05.07.2011 - 12:14
fonte
0

Moltiplica tutto abs(sin(i)) * 4294967296 come float. Solo così si ottiene il risultato intero. E sin (int) non è int, è un float tra [-1,1].

    
risposta data 05.07.2011 - 12:37
fonte

Leggi altre domande sui tag