我们的应用程序具有以下表格定义:
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
答案 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)