Подтвердить что ты не робот

SQL Server: NEWID() всегда дает уникальный идентификатор?

NEWID() никогда не дает мне тот же идентификатор, что и раньше? Скажем, я выбираю NEWID() и он возвращает "1" (как пример). Неужели он больше не вернется? Это невозможно?

4b9b3361

Ответ 1

И NEWID() и NEWSEQUENTIALID() предоставляют глобально уникальные значения типа uniqueidentifier.

NEWID() включает в себя случайную активность, поэтому следующее значение непредсказуемо и выполняется медленнее.

NEWSEQUENTIALID() не включает случайную активность, поэтому следующее сгенерированное значение может быть предсказано (не просто!) И выполняется быстрее, чем NEWID().

Таким образом, если вас не беспокоит прогнозируемое следующее значение (по соображениям безопасности), вы можете использовать NEWSEQUENTIALID(). Если вас беспокоит предсказуемость или вы не возражаете против незначительного NEWID() производительности, вы можете использовать NEWID().

Однако, в строгом смысле, все еще есть незначительные шансы, что GUID, сгенерированные на разных машинах, имеют одинаковое значение. На практике это считается невозможным.

Если вам нужна дополнительная информация, прочитайте это: Какой метод генерации GUID лучше всего подходит для обеспечения того, чтобы GUID действительно был уникальным?

Примечание NEWID() соответствует RFC 4122. А другая функция использует алгоритм Microsoft для генерации значения.

Ответ 2

Если вы используете NEWID() на той же машине, то возвращаемое значение всегда будет уникальным, поскольку оно включает текущую NEWID() времени в ее вычислении.

Однако на отдельных машинах/системах вы можете получить технически одинаковый идентификатор, но вероятность того, что это происходит, настолько низка, что сегодня сообщество SQL DB по существу признало, что это невозможно. Microsoft более или менее наложила на них свою репутацию.

Связанный

Ответ 3

У меня был тот же вопрос, поэтому я запустил этот простой запрос, чтобы узнать, насколько уникальным может быть newid(), поскольку вы увидите, что повторных идентификаторов нет даже в тот же самый milisecond:

DECLARE @TRIES BIGINT, @ID UNIQUEIDENTIFIER, @REPEATED_ID UNIQUEIDENTIFIER
SET @TRIES = 1
SET @REPEATED_ID=NEWID()
WHILE @TRIES <= 1000
BEGIN
    SET @ID=NEWID() 
    IF @[email protected]
        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 @[email protected]
END

Вы можете определить @TRIES по своему усмотрению.