我正在对图像文件进行MD5哈希处理,并且希望使用哈希值作为文件名。
如何将哈希值转换为有效的文件名字符串?
编辑:toString()
仅返回"System.Byte[]"
我正在对图像文件进行MD5哈希处理,并且希望使用哈希值作为文件名。
如何将哈希值转换为有效的文件名字符串?
编辑:toString()
仅返回"System.Byte[]"
这个怎么样:
string filename = BitConverter.ToString(yourMD5ByteArray);
如果你喜欢没有连字符的更短的文件名,那么你可以直接使用:
string filename =
BitConverter.ToString(yourMD5ByteArray).Replace("-", string.Empty);
正如一位评论者指出的——普通的base64编码可能会包含'/'字符,这显然会对文件名造成问题。但是,还有其他可用的字符,例如下划线-只需用下划线替换所有的'/'即可。
string filename = Convert.ToBase64String(md5HashBytes).Replace("/","_");
试试这个:
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
这可能是文件名最安全的方式。您总是得到一个十六进制字符串,不需要担心 / 或 + 等字符。
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();
试试这个:
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)
尝试使用MD5的Base32哈希。它会生成文件名安全、不区分大小写的字符串。
string Base32Hash(string input)
{
byte[] buf = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(input));
return String.Join("", buf.Select(b => "abcdefghijklmonpqrstuvwxyz234567"[b & 0x1F]));
}
从技术上讲,在Windows中使用Base64是不好的,因为文件名不区分大小写(至少在资源管理器视图中是这样的)。但在Base64中,“a”与“A”是不同的,这意味着可能不太可能,但您最终会得到更高的冲突率。
更好的选择是十六进制,例如使用BitConverter类,或者如果可以的话,请使用base32编码(在从base64和base32中删除填充的情况下,在128位的情况下,将为您提供类似长度的文件名)。