27

NEWID()函数是否永远不会给我与它已经提供的相同的 ID?假设我选择 aNEWID()并返回“1”(仅作为示例)。它永远不会再返回“1”吗?这是不可能的吗?

4

3 回答 3

30

两者NEWID()NEWSEQUENTIALID()给出 type 的全局唯一值uniqueidentifier

NEWID()涉及随机活动,因此下一个值是不可预测的,并且执行速度较慢。

NEWSEQUENTIALID()不涉及随机活动,因此可以预测下一个生成的值(不容易!)并且执行速度比NEWID().

因此,如果您不关心预测的下一个值(出于安全原因),您可以使用NEWSEQUENTIALID(). 如果您担心可预测性或者您不介意可以使用的微小性能损失NEWID()

但是,从严格意义上讲,不同机器生成的 GUID 具有相同值的可能性仍然可以忽略不计。在实践中,这被认为是不可能的。

如果您想了解更多信息,请阅读以下内容:生成 GUID 的哪种方法最适合确保 GUID 真正唯一?

注意NEWID()符合RFC 4122。另一个函数使用 Microsoft 的算法来生成值。

于 2015-01-29T15:15:01.977 回答
11

如果您在NEWID()同一台机器上运行,那么返回值将始终是唯一的,因为它在计算中包含了当前时间戳。

然而,在不同的机器/系统上,从技术上讲,您可以获得相同的 id,但发生这种情况的可能性非常低,以至于今天的 SQL DB 社区基本上已经接受了这是不可能的。微软或多或少地把他们的声誉寄托在它上面。

有关的

于 2016-02-09T15:45:11.023 回答
4

我有同样的问题,所以我运行了这个简单的查询来查看 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。

于 2018-01-05T15:31:26.157 回答