How do I calculate the equivalent to SQL Server (hashbytes('SHA1',[ColumnName])) in C#?

前端 未结 3 1372
醉梦人生
醉梦人生 2020-12-03 18:50

In my database I have a computed column that contains a SHA1 hash of a column called URLString which holds URLs (e.g. \"http://xxxx.com/index.html\").

I often need t

相关标签:
3条回答
  • 2020-12-03 19:07

    The below code is equivalent to SQL Server's hashbytes('sha1')

    using (SHA1Managed sha1 = new SHA1Managed()) {
        var hash = sha1.ComputeHash(Encoding.Unicode.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"));
        }
    
        string output = sb.ToString();
    }
    
    0 讨论(0)
  • 2020-12-03 19:13

    You're likely getting bitten by character encoding differences:

    http://weblogs.sqlteam.com/mladenp/archive/2009/04/28/Comparing-SQL-Server-HASHBYTES-function-and-.Net-hashing.aspx

    You could try getting the bytes via Encoding.ASCII.GetBytes(url) or Encoding.Unicode.GetBytes(url) and see which one your db is using.

    0 讨论(0)
  • 2020-12-03 19:25

    Below are two methods that do hashing of string and of bytes. The HashBytes method returns Base64 of the resulting bytes but you can return just the bytes if you prefer them

    public static string HashString(string cleartext)
    {
        byte[] clearBytes = Encoding.UTF8.GetBytes(cleartext);
        return HashBytes(clearBytes);
    }  
    
    public static string HashBytes(byte[] clearBytes)
    {
        SHA1 hasher = SHA1.Create();
        byte[] hashBytes =   hasher.ComputeHash(clearBytes);
        string hash = System.Convert.ToBase64String(hashBytes);
        hasher.Clear();
        return hash;
    }
    
    0 讨论(0)
提交回复
热议问题