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

时间:2017-04-20 16:47:46

标签: sql-server tsql 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)
);

英语哈希专栏的意图是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

2 个答案:

答案 0 :(得分: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

尝试使用此代替

ABS(CONVERT(bigint, HASHBYTES('md5',[English])))%10

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

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

结果:

Result  Distribution
0   25326
1   25218
2   25115
3   25322
4   25167
5   25322
6   25278
7   25119
8   25139
9   25158

答案 1 :(得分:1)

尝试下面的查询,它根据您的要求给出了不同的哈希值:

--C=0
--B=1
--F=2
--t=3
--D=4
--S=5
--G=6
--A=7
--j=8
--P=9

DECLARE @myText VARCHAR='A'
SELECT ABS((HashBytes( 'md5', @myText ) %9)-1)