MSSQL如何根据指定字符串生成固定永久GUID/UUID
MSSQL 基于输入字符串生成固定GUID实现方案
核心实现逻辑是利用确定性哈希算法对输入字符串计算固定长度哈希值,再转换为GUID格式,全程不使用NEWID()这类随机生成函数,就能保证同一输入永远返回相同GUID。
MD5哈希算法刚好输出16字节二进制结果,和GUID的长度完全匹配,是实现该需求的最优选择,SQL Server 2008及以上版本原生支持。
简易实现(满足同入同出、格式符合GUID要求)
直接创建标量函数即可,代码如下:
CREATE FUNCTION dbo.GetFixedGuidFromString ( @InputStr NVARCHAR(MAX) -- 输入的目标字符串 ) RETURNS UNIQUEIDENTIFIER AS BEGIN -- 对输入字符串计算MD5哈希,得到16字节固定二进制值 DECLARE @HashValue BINARY(16) = HASHBYTES('MD5', @InputStr); -- 二进制值直接转为GUID类型返回,格式自动匹配AAAAAAAA-1234-5678-90AB-AAAAAAAAAAA的标准结构 RETURN CONVERT(UNIQUEIDENTIFIER, @HashValue); END GO
使用方式
-- 多次执行同入参调用,返回值永远固定 SELECT dbo.GetFixedGuidFromString('A12345');
注意事项
- 该实现默认对输入大小写敏感、首尾空格敏感、字符集敏感,例如
'A12345'和'a12345'、'A12345 '会返回不同GUID。如果需要忽略大小写/首尾空格,可在哈希计算前对输入做预处理,例如将HASHBYTES('MD5', @InputStr)替换为HASHBYTES('MD5', LTRIM(RTRIM(LOWER(@InputStr)))) - 如果传入非字符串类型参数(数字、日期等),务必先显式转换为固定格式的字符串再传入,避免隐式转换规则差异导致哈希结果不一致
- 如果需要更高的哈希抗碰撞性,可以将哈希算法替换为SHA1,截取前16字节二进制值再转GUID即可,MD5对于固定字符串映射GUID的场景性能和实用性已经足够
标准UUID v3实现(跨系统对齐用)
如果需要生成的GUID和其他编程语言(C#/Java/Python等)的标准UUID v3规则完全对齐,可使用以下实现,符合RFC 4122命名空间UUID规范:
CREATE FUNCTION dbo.GetStandardV3GuidFromString ( @InputStr NVARCHAR(MAX), @Namespace UNIQUEIDENTIFIER = '6BA7B814-9DAD-11D1-80B4-00C04FD430C8' -- 默认DNS命名空间,可按需替换为自定义命名空间GUID ) RETURNS UNIQUEIDENTIFIER AS BEGIN DECLARE @NsBytes BINARY(16) = CONVERT(BINARY(16), @Namespace); DECLARE @HashValue BINARY(16) = HASHBYTES('MD5', @NsBytes + CONVERT(VARBINARY(MAX), @InputStr)); -- 按RFC规范设置UUID版本号为v3 SET @HashValue = SUBSTRING(@HashValue, 1, 6) + CAST((CAST(SUBSTRING(@HashValue, 7, 1) AS TINYINT) & 0x0F | 0x30) AS BINARY(1)) + SUBSTRING(@HashValue, 8, 8); -- 按RFC规范设置UUID变体位 SET @HashValue = SUBSTRING(@HashValue, 1, 8) + CAST((CAST(SUBSTRING(@HashValue, 9, 1) AS TINYINT) & 0x3F | 0x80) AS BINARY(1)) + SUBSTRING(@HashValue, 10, 7); RETURN CONVERT(UNIQUEIDENTIFIER, @HashValue); END GO
内容的提问来源于stack exchange,提问作者minicooper
相关产品推荐
相关产品推荐

