【问题标题】:How to convert an MD5 hash to a string and use it as a file name如何将 MD5 哈希转换为字符串并将其用作文件名
【发布时间】:2009-04-17 12:09:26
【问题描述】:

我正在获取图像文件的 MD5 哈希值,我想将哈希值用作文件名。

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

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

【问题讨论】:

  • 你想将哈希作为十六进制而不是二进制......虽然我不做 c# 所以我不知道如何
  • 请注意,您可能希望使用 SHAx,因为 MD5 正在逐步淘汰。
  • 停止使用 MD5 的唯一原因是最近针对它的加密攻击(与 SHA-0/1 相同)。如果您不出于加密原因使用它,则无需急于更改。
  • 对于没有安全考虑的简单散列,MD5 应该仍然足够。

标签: c# md5


【解决方案1】:

System.Convert.ToBase64String

正如评论者指出的那样——正常的 base 64 编码可以包含一个“/”字符,这显然是文件名的问题。但是,还有其他可用的字符,例如下划线 - 只需将所有“/”替换为下划线即可。

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

【讨论】:

  • 我在使用它时遇到了一个错误,如果尝试说 test.jpg 它可以工作吗??
  • 查看字符串中有“/”,错误是找不到part pf path??
  • 要么删除所有“/”字符,要么使用我在回答中建议的方法。
  • 您需要将所有 / 和 + 字符转换为 _ 和 - 字符。
  • "+" 字符不被禁止,无需删除。
【解决方案2】:

这个怎么样:

string filename = BitConverter.ToString(yourMD5ByteArray);

如果您更喜欢没有连字符的较​​短文件名,那么您可以使用:

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

【讨论】:

  • 注意这里使用十六进制编码。
【解决方案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)

【讨论】:

  • Guid.ToString() 不使用原始字节数组的顺序!
【解决方案4】:

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

        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();

【讨论】:

    【解决方案5】:

    试试这个:

    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
    

    【讨论】:

    • 请注意,Base64 生成区分大小写的名称,因为它同时使用大写和小写字母。 Windows 文件系统不区分大小写,所以要小心。
    【解决方案6】:

    如果这是 Windows,从技术上讲,使用 Base64 是不好的,文件名不区分大小写(至少在资源管理器视图中)。但在 base64 中,“a”与“A”不同,这意味着可能不太可能,但你最终会得到更高的碰撞率..

    更好的选择是像 bitconverter 类这样的十六进制,或者如果您可以使用 base32 编码(在从 base64 和 base32 中删除填充后,在 128 位的情况下,将为您提供相似长度的文件名)。

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

      • 请注意,MD5 不符合 FIPS 标准,并且会在启用了 FIPS 的机器上引发异常。请改用 SHA1。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 2017-10-28
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多