2009-04-17 6 views
5

Je prends le hachage MD5 d'un fichier image et je veux utiliser le hachage comme un nom de fichier.Comment convertir un hachage MD5 à une chaîne et l'utiliser comme un nom de fichier

Comment puis-je convertir le hachage à une chaîne qui est nom de fichier valide?

EDIT: toString() donne juste "System.Byte []"

+0

Vous voulez obtenir le hachage comme hex non binaire ... Je ne fais pas C# si je ne sais pas comment – Greg

+0

Tout comme un heads-up, vous voudrez peut-être utiliser SHAX depuis MD5 est d'être éliminé. –

+1

La seule raison d'abandonner l'utilisation de MD5 est due aux attaques cryptographiques récentes (même chose avec SHA-0/1). Si vous ne l'utilisez pas pour des raisons cryptographiques, il n'y a pas de grande hâte de changer. –

Répondre

10

System.Convert.ToBase64String

En intervenant a souligné - la base normale 64 codage peut contenir un caractère '/', qui obivously un problème avec les noms de fichiers. Cependant, d'autres caractères sont utilisables, comme un trait de soulignement - il suffit de remplacer tous les '/' par un trait de soulignement.

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

Je suis gettig une erreur en utilisant cela et si essayez avec dire test.jpg cela fonctionne ?? – Malcolm

+0

En regardant il y a "/" dans la chaîne et l'erreur est ne peut pas trouver partie pf chemin ?? – Malcolm

+0

Soit supprimer tous les caractères "/" ou utiliser l'approche que je suggère dans ma réponse. – sharptooth

20

Que diriez-vous ceci:

string filename = BitConverter.ToString(yourMD5ByteArray); 

Si vous préférez un nom de fichier plus court sans traits d'union alors vous pouvez simplement utiliser:

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

Ok, je ne sais pas à propos de cette classe, et il fait l'affaire –

+0

Notez que cela utilise un codage hexadécimal. – meandmycode

1

Techniquement en utilisant base64 est mauvais si cela est Windows, les noms de fichiers sont insensibles à la casse (au moins dans la vue des explorateurs) .. mais en base64, 'a' est différent de 'A', cela signifie que peut-être peu probable mais vous obtenez un taux de collision encore plus élevé ..

Une meilleure alternative est hexadécimale comme la classe bitconverter, ou si vous pouvez utiliser le codage base32 (qui après avoir supprimé le remplissage de base64 et base32, et dans le cas de 128bit, vous donnera des noms de fichiers de longueur similaire).

3

Essayez ceci:

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() n'utilise PAS l'ordre séquentiel du tableau d'octets d'origine! – springy76

3

Ceci est probablement le plus sûr pour les noms de fichiers. Vous obtenez toujours une chaîne hexagonale et ne vous inquiétez/ou +, etc.

 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

Essayez ceci:

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

ou

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

Notez que Base64 produit des noms sensibles à la casse car il utilise à la fois des majuscules et des minuscules. Les systèmes de fichiers Windows sont insensibles à la casse, soyez donc prudent. – nzeemin

1

Essayez hachage MD5 de Base32. Il donne des chaînes insensibles à la casse.

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

Veuillez noter que MD5 n'est pas compatible avec FIPS et va lancer des exceptions sur les machines compatibles FIPS. Utilisez SHA1 à la place. –

Questions connexes