官方定義函數:
HashBytes ( '<algorithm>', { @input | 'input' } )
<algorithm>::= MD2 | MD4 | MD5 | SHA | SHA1
參數解釋:
algorithm:標識用於對輸入執行哈希操作的哈希算法。這是必選參數,無默認值。需要使用單引號。
@input : 數據類型為 varchar、nvarchar 或 varbinary
'input' : 字符串數據
返回值:
varbinary (最大8000字節)
備注:允許的輸入值限制為 8000 個字節。輸出符合算法標准:MD2、MD4 和 MD5 為 128 位(即 16 個字節);SHA 和 SHA1 為 160 位(即 20 個字節)
一:示例MD5加密:
一個完整的寫法:
PRINT LOWER(RIGHT(sys.fn_varbintohexstr(HASHBYTES('MD5','這個字符串需要加密')),32)) >> 8926206f9ebb0bee4bbb0724fccb4410
下面逐步拆分
1.先用HashBytes函數看看生成的結果
PRINT HASHBYTES('MD5','這個字符串需要加密') >> 0x8926206F9EBB0BEE4BBB0724FCCB4410
由於該函數返回的值是二進制varbinary 數據,不是字符串不能直接使用,所以要將其轉換為字符串
2.用sys.fn_varbintohexstr(@pbinin)
@pbinin : varbinary (max) 數據類型
返回:nvarchar 數據類型
PRINT sys.fn_varbintohexstr(HASHBYTES('MD5','這個字符串需要加密')) >> 0x8926206f9ebb0bee4bbb0724fccb4410
3.如何得到32位的MD5值,貌似最大也就只能到32位,使用 Right 函數進行截取
PRINT RIGHT(sys.fn_varbintohexstr(HASHBYTES('MD5','這個字符串需要加密')),32) >> 8926206f9ebb0bee4bbb0724fccb4410
函數定義
RIGHT ( character_expression , integer_expression )
參數:
character_expression :可為字符或二進制數據表達式,常量,變量,列,任何能隱式轉換為varchar或nvarchar的數據類型(text,ntext需要進行顯示轉換)
integer_expression :正整數,將返回的字符數
返回值:character_expression 若為 非Unicode 返回 varchar , 若為unicode 則返回nvarchar
4.如果需要統一大小寫 可使用 lower(character_expression ) , upper(character_expression ) 進行轉換
二:關於MD5加密的字符編碼問題
先來幾段對比
1. 字符 “è”
SQLServer :C05FC85230C60ED8FECB3670E77E603D
結果:與C# gb2312對應
2. 字符 “這是漢字”
SQLServer : E8C9AB48B603F81B87F4ED4F1005BB6E
結果:與C# gb2312對應
3. 字符 “123456”
SQLServer : E10ADC3949BA59ABBE56E057F20F883E
結果:與C# gb2312,utf-8 , utf-7 , ascii 對應
4.字符 “pxs123”
SQLServer : 684D95499489435C9351EFCDD68B25F2
結果:與C# gb2312,utf-8 , utf-7 , ascii 對應
4.字符 “pxs!@#.”
SQLServer :FC05D7826726E773E993BDCA88F6B181
結果:與C# gb2312,utf-8 , ascii 對應
5.字符 英文符號“!@#.&*)|_;“
SQLServer :4C782D772102482D09696D11BDE1A02A
結果:與C# gb2312,utf-8 , ascii 對應
6.字符 中文英混合符號“《!)*、“
SQLServer :1A891B7B5B3285925E2783694C2A367C
結果:與C# gb2312對應
6.字符 中文英混合符號“漢字hanzi“
SQLServer :49212C24BDB2FA254880119A332F86D6
結果:與C# gb2312對應
8.字符 “プログラミン“
SQLServer :045B556A9CF5F0FE92EC7A7C9B3F66CA
結果:與C# gb2312對應
綜上對比:
sqlserver中md5加密函數,字符存在非英文字符會按照gb2312方式編碼計算出加密值,那么C#,JS等計算MD5加密值是就需要轉為gb2312編碼,才能得出一樣的結果。
若為都為英文字符時,用utf-8編輯即可