Una funzione di hash come MD5 elabora un messaggio di lunghezza arbitraria (fino a una lunghezza massima incredibilmente grande, qualche zilione di terabyte). Il costo di calcolo grezzo di MD5 può essere suddiviso approssimativamente in tre parti:
-
Inizializzazione : imposta alcuni valori di stato interni.
-
Elaborazione dati : principalmente proporzionale alla lunghezza dell'input.
-
Finalizzazione : i "calcoli di chiusura" della funzione di hash, che producono l'output finale (cose come il riempimento si verificano in quel momento).
OpenSSL, nei suoi benchmark, misura la velocità di eseguire i tre passaggi con messaggi di varie lunghezze, in modo da poter in qualche modo dedurre il costo dell'elaborazione dei dati e il costo degli altri due passaggi .
Tuttavia, tali benchmark non hanno senso perché misurano le prestazioni del codice in condizioni non realistiche. Quando OpenSSL viene eseguito, entra in un ciclo stretto, eseguendo hashing milioni di messaggi in una riga: questo assicura che il codice funzione hash si trovi nella cache L1, che la previsione della branch nella CPU sia pienamente consapevole della direzione probabile di ogni salto condizionato e che i dati di input si trovano anche nella cache della CPU L1. Niente di tutto ciò si applica a una situazione pratica.
In pratica, i costi di larghezza di banda I / O e RAM saranno dominanti, specialmente con funzioni di hash "veloci" come MD5; inoltre, la funzione di hash non è sola nel percorso dei dati e le altre attività contano. Ad esempio, nel tuo codice, la chiamata a strlen()
non avrà un impatto trascurabile se confrontata con MD5 (sarà più veloce, ma non al punto di non essere nemmeno mostrata nelle misure).
Che cosa dovresti fare è misurare le prestazioni del tuo sistema completo , non la sola funzione hash; e fallo con alcune funzioni di hash selezionate: questo utilizzerà il contesto di esecuzione reale. Inoltre, improbabile il costo di hashing stesso rappresenta una parte sostanziale della tua CPU.