Подтвердить что ты не робот

Хеширование с использованием алгоритма SHA1 в С#

Я хочу хешировать массив byte[] с использованием SHA1 Алгоритм с использованием SHA1Managed.
Хэш byte[] будет получен из unit test.
Ожидаемый хэш 0d71ee4472658cd5874c5578410a9d8611fc9aef (чувствителен к регистру).

Как я могу это достичь?

public string Hash(byte [] temp)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {

    }
}
4b9b3361

Ответ 1

Для тех, кто хочет "стандартное" форматирование текста хеша, вы можете использовать что-то вроде следующего:

static string Hash(string input)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(input));
        var sb = new StringBuilder(hash.Length * 2);

        foreach (byte b in hash)
        {
            // can be "x2" if you want lowercase
            sb.Append(b.ToString("X2"));
        }

        return sb.ToString();
    }
}

Это создаст хеш, например 0C2E99D0949684278C30B9369B82638E1CEAD415.

Или для игры в гольф с кодом:

static string Hash(string input)
{
    var hash = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input));
    return string.Concat(hash.Select(b => b.ToString("x2")));
}

Ответ 2

public string Hash(byte [] temp)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        var hash = sha1.ComputeHash(temp);
        return Convert.ToBase64String(hash);
    }
}

EDIT:

Вы также можете указать кодировку при преобразовании массива байтов в строку следующим образом:

return System.Text.Encoding.UTF8.GetString(hash);

или

return System.Text.Encoding.Unicode.GetString(hash);

Ответ 3

Это то, с чем я пошел. Для тех из вас, кто хочет оптимизировать, просмотрите fooobar.com/questions/10949/....

    public static string Hash(string stringToHash)
    {
        using (var sha1 = new SHA1Managed())
        {
            return BitConverter.ToString(sha1.ComputeHash(Encoding.UTF8.GetBytes(stringToHash)));
        }
    }

Ответ 4

Вы можете "вычислить значение для указанного байтового массива", используя ComputeHash:

var hash = sha1.ComputeHash(temp);

Если вы хотите проанализировать результат в строковом представлении, вам нужно будет отформатировать байты, используя спецификатор формата {0:X2}.

Ответ 5

Самый быстрый способ:

    public static string GetHash(string input)
    {
        return string.Join("", (new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input))).Select(x => x.ToString("X2")).ToArray());
    }

Для вывода с малым символом используйте x2 вместо x2

Ответ 6

Я брошу свою шляпу здесь:

(как часть статического класса, так как этот фрагмент является двумя расширениями)

//hex encoding of the hash, in uppercase.
public static string Sha1Hash (this string str)
{
    byte[] data = UTF8Encoding.UTF8.GetBytes (str);
    data = data.Sha1Hash ();
    return BitConverter.ToString (data).Replace ("-", "");
}
// Do the actual hashing
public static byte[] Sha1Hash (this byte[] data)
{
    using (SHA1Managed sha1 = new SHA1Managed ()) {
    return sha1.ComputeHash (data);
}

Ответ 7

Вот самая лучшая версия вычисления SHA1 для данной строки.

public class ComputeSha1
{
    public static string SHA1HashStringForUTF8String(string s)
    {
        byte[] bytes = Encoding.UTF8.GetBytes(s);

        var sha1 = SHA1.Create();
        byte[] hashBytes = sha1.ComputeHash(bytes);

        return HexStringFromBytes(hashBytes);
    }
    public static string HexStringFromBytes(byte[] bytes)
    {
        var sb = new StringBuilder();
        foreach (byte b in bytes)
        {
            var hex = b.ToString("x2");
            sb.Append(hex);
        }
        return sb.ToString();
    }
}

// Calling method    
string result= ComputeSha1.SHA1HashStringForUTF8String("mehran");