2009-04-17 16 views
5

Estoy tomando el hash MD5 de un archivo de imagen y quiero usar el hash como nombre de archivo.Cómo convertir un hash MD5 en una cadena y usarlo como nombre de archivo

¿Cómo convierto el hash en una cadena cuyo nombre de archivo es válido?

EDIT: toString() apenas da "System.Byte []"

+0

usted desea conseguir el hash como hexagonal no binario ... No hago C# aunque por lo que no sé cómo – Greg

+0

Del mismo modo que las cabezas para arriba, es posible que desee utilizar SHAX ya está siendo MD5 eliminado. –

+1

La única razón para dejar de usar MD5 es debido a los ataques criptográficos contra ella recientemente (lo mismo con SHA-0/1). Si no lo usa por razones criptográficas, no hay mucha prisa por cambiar. –

Respuesta

10

System.Convert.ToBase64String

Como comentarista señaló - normal de base 64 de codificación puede contener un carácter '/', que obivously será un problema con nombres de archivos. Sin embargo, hay otros caracteres que se pueden usar, como un guión bajo: simplemente reemplace todo el '/' con un guión bajo.

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

Estoy obteniendo un error al usar eso y si lo intento con say test.jpg ¿funciona? – Malcolm

+0

Mirándolo, hay "/" en la cadena y el error es ¿no puede encontrar la parte de la ruta de acceso? – Malcolm

+0

Elimine todos los caracteres "/" o utilice el enfoque que sugiero en mi respuesta. – sharptooth

20

¿Qué tal esto:

string filename = BitConverter.ToString(yourMD5ByteArray); 

Si prefiere un nombre de archivo más corto sin guiones a continuación, puedes utilizar:

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

Ok, no sabía acerca de esta clase, y hace el truco –

+0

Tenga en cuenta que esto utiliza la codificación hexadecimal. – meandmycode

1

Técnicamente base 64 es malo si se trata de Windows, los nombres de archivo son insensibles a mayúsculas y minúsculas (al menos en la vista de exploradores) ... pero en base64, "a" es diferente a "A", esto significa que quizás sea poco probable pero termines con una tasa de colisión aún mayor.

Una mejor alternativa es hexadecimal como la clase bitconverter, o si puede usar la codificación base32 (que después de eliminar el relleno de base64 y base32, y en el caso de 128 bits, le dará nombres de archivo de longitud similar).

3

Prueba esto:

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() NO utiliza el orden secuencial de la matriz de bytes de origen. – springy76

3

Este es probablemente el más seguro para los nombres de archivo. Siempre una cadena hexadecimal y nunca se preocupe por/o +, 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

Prueba esto:

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

Tenga en cuenta que Base64 produce nombres que distinguen entre mayúsculas y minúsculas, ya que utiliza mayúsculas y minúsculas. Los sistemas de archivos de Windows no distinguen entre mayúsculas y minúsculas, así que tenga cuidado con eso. – nzeemin

1

Trate Base32 de hash MD5. Proporciona cadenas insensibles a mayúsculas y minúsculas de nombre de archivo.

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

Tenga en cuenta que MD5 no es compatible con FIPS y generará excepciones en máquinas con FIPS habilitado. Use SHA1 en su lugar. –

Cuestiones relacionadas