//Forked from kristopherjohnson/SHA1Util.cs gist
using System.Security.Cryptography;
using System.Text;

namespace Snippets
{
    public static class SHA1Util
    {
    	/// <summary>
        /// Compute hash for string encoded as UTF8
        /// </summary>
        /// <param name="s">String to be hashed</param>
        /// <returns>40-character hex string</returns>
        public static string SHA1HashStringForUTF8String(string s)
        {
            byte[] bytes = Encoding.UTF8.GetBytes(s);
 
            var sha1 = SHA1.Create();
            byte[] hashBytes = sha1.ComputeHash(bytes);
 
            return HexStringFromBytes(hashBytes);
        }
    	
        /// <summary>
        /// Compute hash for Unicode encoded string.
        /// This is the exact same Hash that the following SQL Server SHA1 Hash will produce...
        /// SET @hash = HASHBYTES('SHA1', @dataJson);
		/// SET @hash64str = cast('' as xml).value('xs:hexBinary(sql:variable("@hash"))', 'varchar(max)');
		/// just in case you need to recreate the hash in C#
        /// </summary>
        /// <param name="s">String to be hashed</param>
        /// <returns>40-character hex string</returns>
        public static string SHA1HashStringForUnicodeString(string s)
        {
            byte[] bytes = Encoding.Unicode.GetBytes(s);
 
            var sha1 = SHA1.Create();
            byte[] hashBytes = sha1.ComputeHash(bytes);
 
            return HexStringFromBytes(hashBytes).ToUpperInvariant();
        }

        /// <summary>
        /// Convert an array of bytes to a string of hex digits
        /// </summary>
        /// <param name="bytes">array of bytes</param>
        /// <returns>String of hex digits</returns>
        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(); 
        }
    }
}