如何在另一列中创建一个0-9哈希文本的列?

Ala*_*an2 4 t-sql sql-server hash

我们的应用程序具有以下表定义:

CREATE TABLE [dbo].[Phrase] (
    [PhraseId]    UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL,
    [English]     NVARCHAR (250)   NOT NULL,
    [EnglishHash] AS (CONVERT([bigint],hashbytes('md5',[English])%(5)+(5))) PERSISTED,
    PRIMARY KEY CLUSTERED ([PhraseId] ASC)
);
Run Code Online (Sandbox Code Playgroud)

意图是EnglishHash列的值为0,1,2,3,4,5,6,7,8或9

然而,它只给出了值:1,2,3,4,5,6,7,8或9

任何人都可以帮助解释我如何修改它,所以它给0-9值包括?

请注意,我尝试了Sandip的建议.这给了我一个分发但超过11,000条记录,分布不是我的预期:

0   593
9   652
3   1324
6   1253
7   1293
1   1932
4   1325
5   1282
2   1295
8   635
Run Code Online (Sandbox Code Playgroud)

EMU*_*VIL 9

您的结果只允许您有9个不同的值,因为您的模数为5.请查看以下结果.如果你继续使用模数,你会发现它不能是任何大于4且不小于-4的整数(这是在添加最后的+5之前).它只是开始循环.相反,为什么不采用二进制散列的bigint值的绝对值的10的模数.

SELECT 0%5
    , 1%5
    , 2%5
    , 3%5
    , 4%5
    , 5%5
    , 6%5

SELECT 0%5
    , -1%5
    , -2%5
    , -3%5
    , -4%5
    , -5%5
    , -6%5
Run Code Online (Sandbox Code Playgroud)

请尝试使用它

ABS(CONVERT(bigint, HASHBYTES('md5',[English])))%10
Run Code Online (Sandbox Code Playgroud)

这是一个使用系统错误消息的一些随机文本的好例子.

SELECT ABS(CONVERT(bigint, HASHBYTES('md5',[text])))%10 AS 'Result'
    , COUNT(*) AS 'Distribution'
from sys.messages
GROUP BY ABS(CONVERT(bigint, HASHBYTES('md5',[text])))%10
ORDER BY ABS(CONVERT(bigint, HASHBYTES('md5',[text])))%10
Run Code Online (Sandbox Code Playgroud)

结果:

Result  Distribution
0   25326
1   25218
2   25115
3   25322
4   25167
5   25322
6   25278
7   25119
8   25139
9   25158
Run Code Online (Sandbox Code Playgroud)