# 10. Funzioni di Compressione
Questo è il cuore della funzione hash.
Per ogni parola del programma dei messaggi, usiamo i valori attuali nei registri di stato per calcolare due nuove parole temporanee (T1
e T2
).
# Parola Temporanea 1 (t1.rb
)
T1 = Σ1(e) + Ch(e, f, g) + h + Kt + Wt
Questa parola temporanea prende la prossima parola nel message schedule insieme alla prossima costante dalla lista. Questi valori aggiunti a una rotazione Σ1
del quinto valore nel registro di stato, la choice
dei valori negli ultimi tre registri, e il valore dell'ultimo registro da solo.
# Parola Temporanea 2 (t2.rb
)
T2 = Σ0(a) + Maj(a, b, c)
Questa parola temporanea è calcolata aggiungendo una Σ0
rotazione del primo valore nel registro di stato a una majority
dei valori nei primi tre registri.
# Compressione (compression.rb
)
Dopo aver calcolato le due parole temporanee, spostiamo ogni valore nei registri di stato verso il basso di una posizione, e aggiorniamo i seguenti registri:
- Il primo valore nel registro di stato diventa
T1
+T2
. - Il quinto valore nel registro di stato ha
T1
aggiunto ad esso.
Questo è un "giro" di compressione, e viene ripetuto per ogni parola del message schedule.
Dopo aver compresso l'intero message schedule, aggiungiamo il valore hash risultante al valore hash iniziale con cui abbiamo iniziato. Questo ci dà il valore hash finale per questo blocco di messaggi.
Se ci sono altri blocchi di messaggi da elaborare, il valore di hash corrente sarà usato come valore di hash iniziale nella prossima compressione.