Хеширование с использованием алгоритма SHA1 в С#
Я хочу хешировать массив byte[]
с использованием SHA1
Алгоритм с использованием SHA1Managed
.
Хэш byte[]
будет получен из unit test.
Ожидаемый хэш 0d71ee4472658cd5874c5578410a9d8611fc9aef
(чувствителен к регистру).
Как я могу это достичь?
public string Hash(byte [] temp)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
}
}
Ответы
Ответ 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");