为什么此 Salt CAST 在 SQL 服务器中为 NVARCHAR(32)?

Why is this Salt CAST as NVARCHAR(32) in SQL Server?

我了解了如何使用 HASHING 和 Salt 在 SQL 服务器数据库中存储密码。这段代码是在线的,没有真正有用的评论部分,所以我想在这里问一下。

为什么@salt在这里被转换为NVARCHAR(36)

我尝试了不同的长度,比如 NVARCHAR(50),在数据库中,Salt 仍然保存为长度为 36 的字符串。

例如:

B25243D7-A126-48A8-90F2-5898572F54D2

E29E1CEF-DBE1-4373-9510-A911BA0C8672
CREATE TABLE dbo.[User1]
(
    UserID INT IDENTITY(1,1) NOT NULL,
    LoginName NVARCHAR(40) NOT NULL,
    PasswordHash BINARY(64) NOT NULL,
    Salt UNIQUEIDENTIFIER,
    FirstName NVARCHAR(40) NULL,
    LastName NVARCHAR(40) NULL,
    CONSTRAINT [PK1_User_UserID] PRIMARY KEY CLUSTERED (UserID ASC)
)

CREATE PROCEDURE dbo.uspAddUser1
    @pLogin NVARCHAR(50), 
    @pPassword NVARCHAR(50),
    @pFirstName NVARCHAR(40) = NULL, 
    @pLastName NVARCHAR(40) = NULL,
    @responseMessage NVARCHAR(250) OUTPUT
AS
BEGIN
    SET NOCOUNT ON

    DECLARE @salt UNIQUEIDENTIFIER=NEWID()
    BEGIN TRY
        INSERT INTO dbo.[User1] (LoginName, PasswordHash, Salt, FirstName, LastName)
        VALUES(@pLogin, HASHBYTES('SHA2_512', @pPassword+CAST(@salt AS NVARCHAR(36))), @salt, @pFirstName, @pLastName)

       SET @responseMessage = 'Success'
    END TRY
    BEGIN CATCH
        SET @responseMessage = ERROR_MESSAGE() 
    END CATCH
END
DECLARE @responseMessage NVARCHAR(250)

EXEC [dbo].[uspAddUser1]
            @pLogin = 'admin2',
            @pPassword = '123456',
            @pFirstName = 'John',
            @pLastName = 'Smith',
            @responseMessage = @responseMessage OUTPUT

SELECT * FROM [dbo].[User1]

是因为DECLARE @salt UNIQUEIDENTIFIER=NEWID()。在 sql 服务器 NEWID() 函数中 returns 字符长度为 36

UNIQUEIDENTIFIER