Hash SHA1
#
// La funzione [_SHA-1_](https://it.wikipedia.org/wiki/Secure_Hash_Algorithm)
// viene frequentemente utilizzata per calcolare il _digest_
// (l'impronta) dei file binari o di testo.
// Ad esempio il sistema di versionamento [git](http://git-scm.com/)
// utilizza gli SHA-1 in modo intensivo per identificare
// i file e le cartelle versionate. Ecco come calcolare
// gli hash SHA-1 in Go.
package main
// Si possono trovare implementazioni di svariati algoritmi
// crittografici dentro il pacchetto `crypto/*`.
import "crypto/sha1"
import "fmt"
func main() {
s := "sha1 this string"
// Il pattern per creare un nuovo hash è `sha1.New()`,
// `sha1.Write(bytes)`, ed infine `sha1.Sum([]byte{})`.
// Iniziamo creando un nuovo hash.
h := sha1.New()
// La funzione `Write` lavora con i bytes.
// Se si deve calcolare l'hash di una stringa `s`
// è possibile utilizzare `[]byte(s)` per ottenerne i bytes.
h.Write([]byte(s))
// Con la funzione `Sum` è possibile ottenere il valore
// dell'hash. L'argomento può essere utilizzato per
// accodare il valore calcolato ad uno slice di byte
// esistente, non è generalmente necessario.
bs := h.Sum(nil)
// Gli SHA-1 sono generalmente stampati in formato
// esadecimale (ad esempio nei commit di git). Utilizza
// '%x' per stampare il valore in esadecimale.
fmt.Println(s)
fmt.Printf("%x\n", bs)
}
# Eseguendo il programma si nota che viene calcolato
# l'hash della funzione e stampato in esadecimale
# a schermo
$ go run sha1-hashes.go
sha1 this string
cf23df2207d99a74fbe169e3eba035e633b65d94
# È possibile calcolare altre funzioni hash in un modo
# molto simile. Ad esempio per calcolare l'MD5 è
# sufficiente importare `crypto/md5` ed usare
# `md5.New()`.
# Nota che se necessiti di funzioni hash che siano sicure
# dal punto di vista crittografico, ti consigliamo di
# approfondire il tema dello [hash strength](http://en.wikipedia.org/wiki/Cryptographic_hash_function)!