如何将 MD5 哈希转换为字符串并将其用作文件名

发布于 2024-07-17 10:00:15 字数 129 浏览 3 评论 0原文

我正在获取图像文件的 MD5 哈希值,并且想使用该哈希值作为文件名。

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

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

I am taking the MD5 hash of an image file and I want to use the hash as a filename.

How do I convert the hash to a string that is valid filename?

EDIT: toString() just gives "System.Byte[]"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

寂寞美少年 2024-07-24 10:00:15

怎么样:

string filename = BitConverter.ToString(yourMD5ByteArray);

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

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

How about this:

string filename = BitConverter.ToString(yourMD5ByteArray);

If you prefer a shorter filename without hyphens then you can just use:

string filename =
    BitConverter.ToString(yourMD5ByteArray).Replace("-", string.Empty);
宫墨修音 2024-07-24 10:00:15

System.Convert.ToBase64String

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

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

System.Convert.ToBase64String

As a commenter pointed out -- normal base 64 encoding can contain a '/' character, which obivously will be a problem with filenames. However, there are other characters that are usable, such as an underscore - just replace all the '/' with an underscore.

string filename = Convert.ToBase64String(md5HashBytes).Replace("/","_");
浊酒尽余欢 2024-07-24 10:00:15

尝试这个:

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)

Try this:

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)
淡忘如思 2024-07-24 10:00:15

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

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

This is probably the safest for file names. You always get a hex string and never worry about / or +, 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();
小傻瓜 2024-07-24 10:00:15

试试这个:

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

Try this:

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

or

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
纵山崖 2024-07-24 10:00:15

从技术上讲,如果这是 Windows,则使用 Base64 是不好的,文件名不区分大小写(至少在资源管理器视图中)..但在 Base64 中,“a”与“A”不同,这意味着也许不太可能,但最终会获得更高的速率 更好的替代方案是像 bitconverter 类那样的十六进制

,或者如果您可以使用 base32 编码(在从 Base64 和 Base32 中删除填充后,在 128 位的情况下,将为您提供相似长度的文件名)。

Technically using Base64 is bad if this is Windows, filenames are case insensitive (at least in explorers view).. but in base64, 'a' is different to 'A', this means that perhaps unlikely but you end up with even higher rate of collision..

A better alternative is hexadecimal like the bitconverter class, or if you can- use base32 encoding (which after removing the padding from both base64 and base32, and in the case of 128bit, will give you similar length filenames).

淡笑忘祈一世凡恋 2024-07-24 10:00:15

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

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

Try Base32 hash of MD5. It gives filename-safe case insensitive strings.

    string Base32Hash(string input)
    {
        byte[] buf = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(input));
        return String.Join("", buf.Select(b => "abcdefghijklmonpqrstuvwxyz234567"[b & 0x1F]));
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文