2009-04-17 17 views
5

Sto prendendo l'hash MD5 di un file immagine e voglio usare l'hash come nome file.Come convertire un hash MD5 in una stringa e usarlo come nome file

Come si converte l'hash in una stringa che è un nome file valido?

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

+0

si desidera ottenere l'hash non esadecimale binario ... non faccio C# anche se così non so come – Greg

+0

Proprio come un testa a testa, si potrebbe desiderare di utilizzare Shax dato MD5 è essere eliminato gradualmente. –

+1

L'unico motivo per interrompere l'uso di MD5 è a causa degli attacchi crittografici contro di esso recentemente (lo stesso con SHA-0/1). Se non lo si utilizza per ragioni crittografiche, non c'è molta fretta di cambiare. –

risposta

10

System.Convert.ToBase64String

Come commentatore sottolineato - normale codifica base 64 può contenere un carattere '/', che obivously sarà un problema con nomi di 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("/","_"); 
+0

Mi sto facendo un errore usando quello e se provi con say test.jpg funziona ?? – Malcolm

+0

Guardandolo c'è "/" nella stringa e l'errore non è in grado di trovare il percorso part pf ?? – Malcolm

+0

Rimuovere tutti i caratteri "/" o utilizzare l'approccio che suggerisco nella mia risposta. – sharptooth

20

ne dite di questo:

string filename = BitConverter.ToString(yourMD5ByteArray); 

Se si preferisce un nome di file più breve senza trattini allora si può solo usare:

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

Ok, non lo sapevo su questa classe, e fa il trucco –

+0

Nota questo usa la codifica esadecimale. – meandmycode

1

Tecnicamente usando Base64 è male se questo è Windows, i nomi dei file sono case insensitive (almeno nella vista explorer) .. ma in base64, 'a' è diverso da 'A', questo significa che forse è improbabile ma si finisce con un tasso di collisione ancora più alto.

Un'alternativa migliore è esadecimale come la classe bitconverter oppure, se è possibile, 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).

3

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) 
+0

Guid.ToString() utilizza NON l'ordine sequenziale dell'array di byte di origine! – springy76

3

Questo è probabilmente il più sicuro per i nomi dei file. Il tutto per ottenere una stringa esadecimale e non preoccuparti/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(); 
3

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 
+0

Nota che Base64 produce nomi con distinzione tra maiuscole e minuscole perché utilizza sia lettere maiuscole che minuscole. I file system di Windows non fanno distinzione tra maiuscole e minuscole, quindi fai attenzione. – nzeemin

1

Prova Base32 hash 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])); 
    } 
+0

Si noti che MD5 non è conforme a FIPS e genererà eccezioni su macchine con FIPS abilitato. Utilizzare invece SHA1. –