t-sql:散列是否保留顺序?

t-sql: does hashing preserve order?

我需要在 SQL table 上散列主键,但我需要保留数字顺序。

哈希函数HASHBYTES ( '<algorithm>', { @input | 'input' } )会保留这样的顺序吗? function doc

这很容易测试:

CREATE TABLE dbo.YourTable (ID int IDENTITY,
                            GUID uniqueidentifier DEFAULT NEWSEQUENTIALID(),
                            HashedID varbinary(8000) NULL,
                            HashedGUID varbinary(8000) NULL);
GO

INSERT INTO dbo.YourTable
DEFAULT VALUES
GO 10

UPDATE dbo.YourTable
SET HashedID = HASHBYTES('SHA2_256', CONVERT(nvarchar(32),ID)),
    HashedGUID = HASHBYTES('SHA2_256', CONVERT(nvarchar(36),GUID));
GO

SELECT *,
       ROW_NUMBER() OVER (ORDER BY HashedID) AS HashedIDOrder,
       ROW_NUMBER() OVER (ORDER BY HashedGUID) AS HashedGUIDOrder
FROM dbo.YourTable
ORDER BY ID ASC;

GO
DROP TABLE dbo.YourTable;

对于我得到的结果,答案很明确:“否”。

ID          GUID                                 HashedIDOrder        HashedGUIDOrder
----------- ------------------------------------ -------------------- --------------------
1           8655266A-0054-EB11-8144-F0921C07876B 10                   5
2           8755266A-0054-EB11-8144-F0921C07876B 5                    7
3           8855266A-0054-EB11-8144-F0921C07876B 7                    9
4           8955266A-0054-EB11-8144-F0921C07876B 3                    4
5           8A55266A-0054-EB11-8144-F0921C07876B 2                    6
6           8B55266A-0054-EB11-8144-F0921C07876B 6                    2
7           8C55266A-0054-EB11-8144-F0921C07876B 9                    8
8           8D55266A-0054-EB11-8144-F0921C07876B 1                    10
9           8E55266A-0054-EB11-8144-F0921C07876B 8                    3
10          8F55266A-0054-EB11-8144-F0921C07876B 4                    1