Как преобразовать хеш MD5 в строку и использовать его в качестве имени файла - PullRequest
5 голосов
/ 17 апреля 2009

Я беру хэш MD5 файла изображения и хочу использовать хеш в качестве имени файла.

Как мне преобразовать хеш в строку, которая является допустимым именем файла?

РЕДАКТИРОВАТЬ: toString() просто дает "System.Byte []"

Ответы [ 7 ]

20 голосов
/ 17 апреля 2009

Как насчет этого:

string filename = BitConverter.ToString(yourMD5ByteArray);

Если вы предпочитаете более короткое имя файла без дефисов, вы можете просто использовать:

string filename =
    BitConverter.ToString(yourMD5ByteArray).Replace("-", string.Empty);
11 голосов
/ 17 апреля 2009

System.Convert.ToBase64String

Как отметил комментатор - обычная кодировка base 64 может содержать символ '/', что, несомненно, будет проблемой с именами файлов. Однако есть и другие символы, которые можно использовать, например, подчеркивание - просто замените все символы «/» на подчеркивание.

string filename = Convert.ToBase64String(md5HashBytes).Replace("/","_");
3 голосов
/ 21 июня 2012

Попробуйте это:

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
3 голосов
/ 02 декабря 2011

Это, пожалуй, самый безопасный для имен файлов. Вы всегда получаете шестнадцатеричную строку и никогда не беспокоитесь о / или + и т. Д.

        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 голосов
/ 03 июня 2009

Попробуйте это:

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)
1 голос
/ 27 июля 2012

Попробуйте Base32 хеш MD5. Это дает безопасные для имени файла строки без учета регистра.

    string Base32Hash(string input)
    {
        byte[] buf = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(input));
        return String.Join("", buf.Select(b => "abcdefghijklmonpqrstuvwxyz234567"[b & 0x1F]));
    }
1 голос
/ 17 апреля 2009

Технически использовать Base64 плохо, если это Windows, имена файлов нечувствительны к регистру (по крайней мере, в представлении исследователей) ... но в base64 «a» отличается от «A», это означает, что, возможно, маловероятно, но в итоге вы получите еще более высокий уровень столкновения ..

Лучшей альтернативой является шестнадцатеричный код, такой как класс bitconverter, или, если вы можете использовать кодировку base32 (которая после удаления заполнения и из base64 и base32, и в случае 128bit даст вам имена файлов одинаковой длины).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...