# 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.