Dimensioni del blocco di velocità Openssl

1

Non capisco davvero cosa significhi esattamente block size nell'output di velocità openssl. Qui: Come posso interpretare l'output di velocità openssl? Ho trovato la risposta che è la lunghezza del messaggio di input. Quindi, dovrei capire in questo modo:

Voglio misurare le prestazioni di md5 per il messaggio di dimensione 512, dovrei farlo in questo modo:

// assume that 'txt' has a length of 64, 
// so for char its 8 (char size) * 64 (text length) = 512 block size 
char txt = "..."; 
MD5((unsigned char*)&txt, strlen(txt), (unsigned char*)&digest);

o in questo modo:

char txt = "..."; // assume it has length of 512
MD5((unsigned char*)&txt, strlen(txt), (unsigned char*)&digest);

? Quello che sto cercando di ottenere qui è di essere in grado di testare algoritmi con varie lunghezze di input, non solo per quelli definiti a velocità openssl.

    
posta yak 13.07.2013 - 22:07
fonte

1 risposta

2

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.

    
risposta data 16.07.2013 - 17:10
fonte

Leggi altre domande sui tag