2009-04-17 139 views
5

我正在使用图像文件的MD5哈希,并且希望将哈希用作文件名。如何将MD5哈希转换为字符串并将其用作文件名

如何将散列转换为有效文件名的字符串?

编辑:toString()只是给出 “System.Byte []”

+0

你想要得到的哈希值作为十六进制不是二进制......我不这样做C#虽然,所以我不知道该怎么 – Greg 2009-04-17 12:11:44

+0

正如抬起头,你可能想使用SHAx因为MD5是被逐步淘汰。 – 2009-04-17 12:32:28

+1

停止使用MD5的唯一原因是最近发生密码攻击(与SHA-0/1相同)。如果你不是出于加密原因使用它,那么不需要急于转换。 – 2009-04-17 12:45:25

回答

10

System.Convert.ToBase64String

作为评论者指出的 - 正常基64编码可以包含一个 '/' 字符,这obivously将是一个问题与文件名。但是,还有其他可用的字符,例如下划线 - 只需用下划线替换所有的'/'即可。

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

我gettig使用该错误,如果尝试与说test.jpg它的工作原理? – Malcolm 2009-04-17 12:24:12

+0

看着它的字符串中有“/”,错误是找不到部分pf路径? – Malcolm 2009-04-17 12:27:12

20

如何:

string filename = BitConverter.ToString(yourMD5ByteArray); 

如果你喜欢不带连字符短文件名,那么你可以只使用:使用

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

技术上Base64是坏的,如果这是Windows的文件名是不区分大小写的(至少在探索者看来)..但在base64中,'a'与'A'不同,这意味着可能不太可能,但最终碰撞速度会更高。

一个更好的选择是像bitconverter类的十六进制,或者如果你可以使用base32编码(从base64和base32中删除填充,在128位的情况下,会给你类似的长度文件名)。

3

试试这个:

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) 
3

这可能是最安全的文件名。你总是得到一个十六进制字符串,从不担心/或+等

 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

试试这个:

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

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 
1

尝试的MD5哈希Base32。它提供文件名安全的不区分大小写的字符串。

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