Простой пример хеширования нескольких строк.
public static string Hash(bool caseInsensitive, params string[] strs)
{
using (var sha256 = SHA256.Create())
{
for (int i = 0; i < strs.Length; i++)
{
string str = caseInsensitive ? strs[i].ToUpperInvariant() : strs[i];
byte[] bytes = Encoding.UTF8.GetBytes(str);
byte[] length = BitConverter.GetBytes(bytes.Length);
sha256.TransformBlock(length, 0, length.Length, length, 0);
sha256.TransformBlock(bytes, 0, bytes.Length, bytes, 0);
}
sha256.TransformFinalBlock(new byte[0], 0, 0);
var hash = sha256.Hash;
return Convert.ToBase64String(hash);
}
}
Существует параметр caseInsensitive
, потому что foo@bar.com
эквивалентно foo@BAR.COM
(и довольно часто FOO@bar.com
эквивалентно всемих).Обратите внимание, как я кодирую строки: перед каждой строкой я добавляю длину кодированной строки (в UTF8).Таким образом, "Hello", "World"
отличается от "Hello World"
, потому что один будет преобразован во что-то похожее на 5Hello5World
, а другой будет "11Hello World"
.
Usange:
string base64hash = Hash(true, "Donald Duck", "donaldduck@disney.com");
Обратите внимание, что благодаря ключевому слову params
метод Hash
может принимать любое количество (string
) параметров.