SQL Server-生成唯一ID以比较多个列

SQL Server-生成唯一ID以比较多个列,sql,sql-server,hash,sql-server-2014,guid,Sql,Sql Server,Hash,Sql Server 2014,Guid,在SQL Server中,是否可以使用特定数据段作为输入值来生成GUID。比如说, DECLARE @seed1 VARCHAR(10) = 'Test' DECLARE @seed1 VARCHAR(10) = 'Testing' SELECT NEWID(@seed1) -- will always return the same output value SELECT NEWID(@seed2) -- will always return the same output value, an

在SQL Server中,是否可以使用特定数据段作为输入值来生成GUID。比如说,

DECLARE @seed1 VARCHAR(10) = 'Test'
DECLARE @seed1 VARCHAR(10) = 'Testing'
SELECT NEWID(@seed1) -- will always return the same output value
SELECT NEWID(@seed2) -- will always return the same output value, and will be different to the example above
我知道这完全违背了guid的观点,因为ID不是唯一的。我正在寻找一种基于特定标准(@seed值)检测重复记录的方法

我曾尝试使用
HASHBYTES
函数生成
VARBINARY
字符串,但是使用
VARBINARY
在表之间连接似乎非常慢。我希望能找到一个更有效的类似替代方案

编辑:有关我为什么希望实现这一目标的更多信息

我正在寻找一种快速有效的方法来检测存在于两个表中的重复信息。例如,我有名字、姓氏和电子邮件。连接这些记录时,应可用于检查这些记录是否存在于表A和表B中


简单地连接这些字段是可能的,并提供正确的结果,但是速度非常慢。因此,我希望找到一种将数据转换为GUID之类的东西的方法,这将使连接更加高效

我认为您可以使用校验和函数返回int类型。

我认为您可以使用校验和函数返回int类型。

您应该使用
哈希字节
而不是
校验和
,如下所示:

SELECT hashbytes('MD5', 'JOHN' + ',' + 'SMITH' + ',' + 'JSMITH@EXAMPLE.COM')
虽然只有很小的机会校验和可以产生两个完全不同的值的相同数字,但我已经在大约一百万个数据集上发生过这种情况。正如iamdave所指出的(谢谢!),插入某种分隔符(在我的示例中是逗号)是一个好主意,这样您就不会将
'JOH'+'NSMITH'
'JOHN'+'SMITH'
进行同样的比较


您应该使用
hashbytes
而不是像这样使用
checksum

SELECT hashbytes('MD5', 'JOHN' + ',' + 'SMITH' + ',' + 'JSMITH@EXAMPLE.COM')
虽然只有很小的机会校验和可以产生两个完全不同的值的相同数字,但我已经在大约一百万个数据集上发生过这种情况。正如iamdave所指出的(谢谢!),插入某种分隔符(在我的示例中是逗号)是一个好主意,这样您就不会将
'JOH'+'NSMITH'
'JOHN'+'SMITH'
进行同样的比较


您似乎已经决定了做某件事的方法,现在正在就如何做某件特定的事情寻求帮助。请您添加一些代表您的情况和期望输出的虚拟数据好吗?这很可能是一个更简单的解决方案。我正在寻找一种基于特定标准检测重复记录的方法,您能否扩展此要求?这可能是一个XY问题。GUID实际上是一个
二进制(16)
,连接速度也差不多。散列时,
VARBINARY
值可能会变大,但这可以通过使用子字符串来“解决”(以增加冲突概率为代价,但这不是正确加密散列的问题)。如果结果仍然太大/太慢,最好在查找表上使用
标识
序列
,缺点是需要跨调用方同步,但这通常会被加入4字节整数时获得的性能大大提高所抵消。现在您已经解释了为什么需要它,我认为校验和或HASHBYTES函数正是您所需要的;它们是专门为你所想的目的而设计的。(请注意,两个不同的项相加为同一个值的可能性很小,因此您可能应该保留原始的匹配条件,但只要对校验和值进行索引并在查询中使用,SQL Server就应该足够聪明,在进行精确比较之前使用该索引过滤结果。)从概念上讲,您所寻找的绝对是一个“哈希”。如果您只想加速联接,您甚至不需要将较短的值设置为唯一值——它们的唯一性足以加速索引搜索(
,其中hash1=hash2和mycolumn1=mycolumn2
,其中第一部分将允许大部分加速)。即使是
CHECKSUM
也可以实现这一目的,尽管它的冲突率对于许多真实世界的数据来说都很糟糕,而且您可以使用(比如)CONVERT(INT,SUBSTRING(HASHBYTES(…),1,4))。您似乎已经决定了做某件事的方法,现在正在寻求关于如何做某件特定事情的帮助。请您添加一些代表您的情况和期望输出的虚拟数据好吗?这很可能是一个更简单的解决方案。我正在寻找一种基于特定标准检测重复记录的方法,您能否扩展此要求?这可能是一个XY问题。GUID实际上是一个
二进制(16)
,连接速度也差不多。散列时,
VARBINARY
值可能会变大,但这可以通过使用子字符串来“解决”(以增加冲突概率为代价,但这不是正确加密散列的问题)。如果结果仍然太大/太慢,最好在查找表上使用
标识
序列
,缺点是需要跨调用方同步,但这通常会被加入4字节整数时获得的性能大大提高所抵消。现在您已经解释了为什么需要它,我认为校验和或HASHBYTES函数正是您所需要的;它们是专门为你所想的目的而设计的。(请注意,两个不同的项相加为同一个值的可能性很小,因此您可能应该保留原始的匹配条件,但只要对校验和值进行索引并在查询中使用,SQL Server就应该足够聪明,在进行精确比较之前使用该索引过滤结果。)