Come convertire un hash MD5 in una stringa e usarlo come nome di file

Sto prendendo l’hash MD5 di un file immagine e voglio usare l’hash come nome file.

Come faccio a convertire l’hash in una stringa che è un nome file valido?

EDIT: toString() dà solo “System.Byte []”

Cosa ne pensi di questo:

 string filename = BitConverter.ToString(yourMD5ByteArray); 

Se si preferisce un nome file più breve senza trattini, è sufficiente utilizzare:

 string filename = BitConverter.ToString(yourMD5ByteArray).Replace("-", string.Empty); 

System.Convert.ToBase64String

Come ha fatto notare un commentatore, la normale codifica 64 di base può contenere un carattere “/”, che ovviamente sarà un problema con i nomi dei file. Tuttavia, ci sono altri caratteri che sono utilizzabili, come un trattino basso – basta sostituire tutto il ‘/’ con un carattere di sottolineatura.

 string filename = Convert.ToBase64String(md5HashBytes).Replace("/","_"); 

Prova questo:

 Guid guid = new Guid(md5HashBytes); string hashString = guid.ToString("N"); // format: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx string hashString = guid.ToString("D"); // format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx string hashString = guid.ToString("B"); // format: {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} string hashString = guid.ToString("P"); // format: (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) 

Questo è probabilmente il più sicuro per i nomi dei file. Ottieni sempre una stringa esadecimale e non ti preoccupare mai di / o +, ecc.

  byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(inputString)); StringBuilder sBuilder = new StringBuilder(); for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } string hashed = sBuilder.ToString(); 

Prova questo:

 string Hash = Convert.ToBase64String(MD5.Create().ComputeHash(Encoding.UTF8.GetBytes("sample"))); //input "sample" returns = Xo/5v1W6NQgZnSLphBKb5g== 

o

 string Hash = BitConverter.ToString(MD5.Create().ComputeHash(Encoding.UTF8.GetBytes("sample"))); //input "sample" returns = 5E-8F-F9-BF-55-BA-35-08-19-9D-22-E9-84-12-9B-E6 

Tecnicamente l’uso di Base64 è sbagliato se si tratta di Windows, i nomi dei file sono insensibili alle maiuscole e minuscole (almeno nella vista explorer) .. ma in base64, ‘a’ è diverso da ‘A’, questo significa che forse è improbabile ma si finisce con una velocità ancora maggiore di collisione ..

Un’alternativa migliore è esadecimale come la class bitconverter o, se è ansible, utilizzare la codifica base32 (che dopo aver rimosso il padding sia da base64 che base32 e nel caso di 128bit, fornirà nomi di lunghezza simili).

Prova l’hash Base32 di MD5. Fornisce stringhe senza distinzione tra maiuscole e minuscole.

  string Base32Hash(string input) { byte[] buf = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(input)); return String.Join("", buf.Select(b => "abcdefghijklmonpqrstuvwxyz234567"[b & 0x1F])); }