【发布时间】:2021-03-18 01:19:27
【问题描述】:
我有一个 Unicode 字符串,我想使用 2 种不同的工具(Python 和 T-SQL)对其进行哈希处理: 我尝试了以下功能:
CREATE FUNCTION dbo.[FUNC_HASH] (@INPUT VARCHAR(100)) RETURNS VARCHAR(36)
AS
BEGIN
DECLARE @RESULT VARCHAR(36);
SET @RESULT = CONVERT(VARCHAR(100),HASHBYTES('MD5',@INPUT),1);
RETURN SUBSTRING(@RESULT,3,34)
END
GO
SELECT dbo.[FUNC_HASH]('HĐTID123')
ALTER FUNCTION dbo.[FUNC_HASH] (@INPUT NVARCHAR(100)) RETURNS NVARCHAR(36)
AS
BEGIN
DECLARE @RESULT NVARCHAR(36);
SET @RESULT = CONVERT(NVARCHAR(100),HASHBYTES('MD5',@INPUT),1);
RETURN SUBSTRING(@RESULT,3,34)
END
GO
SELECT dbo.[FUNC_HASH](N'HĐTID123')
import hashlib
def hash_coverter(source_str):
result = str(hashlib.md5(str(source_str).encode('utf-8')).hexdigest()).upper()
return result
hash_coverter("HĐTID123")
使用非 Unicode 字符串进行测试时,例如“TID123” 他们都返回相同的答案:'2BDD0FE0AEA9FBC5C27A75085FB14388' 但是当我插入一个 Unicode 字符串时,例如,“HĐTID123”,它们会返回一组不同的结果。
SQL(VARCHAR) : 'FE0E48AA12DF0075C8E2846796B44F10'
SQL(NVARCHAR):'C2A503D87D5EEF7340EDF6EC51DD2C47'
Python:'CE88EADF61D061E8929363169DB60EF8'
有什么方法可以重写这两个函数以获得相同的结果?
我当前的数据库排序规则是 SQL_Latin1_General_CP1_CS_AS。在 T-SQL 函数中使用 NVARCHAR 对我一点帮助都没有。
【问题讨论】:
-
如何用
@INPUT VARCHAR(100)而不是NVARCHAR测试Unicode字符串? -
Ị 已尝试将所有内容切换到 NVARCHAR,但它不起作用...
-
很抱歉,但“它行不通”并没有什么好说的。如果您编辑您的问题以包含带有数据的完整代码示例以及实际和预期结果,也许有人可以提供帮助。
-
向我们展示在每种情况下输入 MD5() 的十六进制数。
-
嗨,我已经编辑添加了在这个问题中使用的完整代码
标签: python python-3.x tsql hash collation