Я хочу хешировать данный byte[]
массив с использованием SHA1
алгоритма с использованием SHA1Managed
. Хэш будет поступать из модульного тестирования.
Ожидаемый хэш (с учетом регистра).byte[]
0d71ee4472658cd5874c5578410a9d8611fc9aef
Как я могу этого добиться?
public string Hash(byte [] temp)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
}
}
hex(e) == hex(E)
Ответы:
Для тех, кто хочет "стандартное" форматирование текста хеша, вы можете использовать что-то вроде следующего:
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"))); }
источник
IDisposable
, но беглый переход к справочнику показывает, что ничего интересного не происходит в.Dispose()
x2
означает строчные,X2
это прописныеpublic string Hash(byte [] temp) { using (SHA1Managed sha1 = new SHA1Managed()) { var hash = sha1.ComputeHash(temp); return Convert.ToBase64String(hash); } }
РЕДАКТИРОВАТЬ:
Вы также можете указать кодировку при преобразовании байтового массива в строку следующим образом:
return System.Text.Encoding.UTF8.GetString(hash);
или же
return System.Text.Encoding.Unicode.GetString(hash);
источник
0d71ee4472658cd5874c5578410a9d8611fc9aef
на выходе?Это то, с чем я пошел. Для тех из вас, кто хочет оптимизировать, посетите https://stackoverflow.com/a/624379/991863 .
public static string Hash(string stringToHash) { using (var sha1 = new SHA1Managed()) { return BitConverter.ToString(sha1.ComputeHash(Encoding.UTF8.GetBytes(stringToHash))); } }
источник
Самый быстрый способ:
public static string GetHash(string input) { return string.Join("", (new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input))).Select(x => x.ToString("X2")).ToArray()); }
Для вывода маленьких символов используйте
x2
вместо ofX2
источник
Вы можете «вычислить значение для указанного массива байтов», используя
ComputeHash
:var hash = sha1.ComputeHash(temp);
Если вы хотите проанализировать результат в строковом представлении, вам нужно будет отформатировать байты, используя
{0:X2}
спецификатор формата.источник
Кину здесь шляпу:
(как часть статического класса, поскольку этот фрагмент представляет собой два расширения)
//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); }
источник