该NEWID()
函数是否永远不会给我与它已经提供的相同的 ID?假设我选择 aNEWID()
并返回“1”(仅作为示例)。它永远不会再返回“1”吗?这是不可能的吗?
3 回答
两者NEWID()
并NEWSEQUENTIALID()
给出 type 的全局唯一值uniqueidentifier
。
NEWID()
涉及随机活动,因此下一个值是不可预测的,并且执行速度较慢。
NEWSEQUENTIALID()
不涉及随机活动,因此可以预测下一个生成的值(不容易!)并且执行速度比NEWID()
.
因此,如果您不关心预测的下一个值(出于安全原因),您可以使用NEWSEQUENTIALID()
. 如果您担心可预测性或者您不介意可以使用的微小性能损失NEWID()
。
但是,从严格意义上讲,不同机器生成的 GUID 具有相同值的可能性仍然可以忽略不计。在实践中,这被认为是不可能的。
如果您想了解更多信息,请阅读以下内容:生成 GUID 的哪种方法最适合确保 GUID 真正唯一?
注意NEWID()
符合RFC 4122。另一个函数使用 Microsoft 的算法来生成值。
如果您在NEWID()
同一台机器上运行,那么返回值将始终是唯一的,因为它在计算中包含了当前时间戳。
然而,在不同的机器/系统上,从技术上讲,您可以获得相同的 id,但发生这种情况的可能性非常低,以至于今天的 SQL DB 社区基本上已经接受了这是不可能的。微软或多或少地把他们的声誉寄托在它上面。
有关的
我有同样的问题,所以我运行了这个简单的查询来查看 newid () 的唯一性,因为您会看到即使在同一毫秒内也没有重复的 ID:
DECLARE @TRIES BIGINT, @ID UNIQUEIDENTIFIER, @REPEATED_ID UNIQUEIDENTIFIER
SET @TRIES = 1
SET @REPEATED_ID=NEWID()
WHILE @TRIES <= 1000
BEGIN
SET @ID=NEWID()
IF @REPEATED_ID=@ID
PRINT 'SAME -> ID '+CONVERT(NVARCHAR(MAX),@TRIES)+': '+ CONVERT(CHAR(36),@ID)
ELSE
PRINT 'DISTINCT -> ID '+CONVERT(NVARCHAR(MAX),@TRIES)+': '+ CONVERT(CHAR(36),@ID) + ' AT ' + CONVERT(VARCHAR,CAST(GETDATE() AS DATETIME2(3))
)
SET @TRIES += 1
SET @REPEATED_ID=@ID
END
您可以根据需要定义@TRIES。