Wie kann ich eine Spalte erstellen, die ein 0-9 Hash Text in einer anderen Spalte ist?

Unsere Anwendung hat folgende Tabellendefinition:

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) ); 

Die Absicht war für die EnglishHash-Säule, ein Wert von entweder 0,1,2,3,4,5,6,7,8 oder 9 zu sein

Allerdings gibt es nur Werte: 1,2,3,4,5,6,7,8 oder 9

Kann jemand dazu beitragen zu erklären, wie ich das ändern kann so gibt es Werte 0-9 inklusive?

Beachten Sie, dass ich den Vorschlag von Sandip ausprobiert habe. Das gibt mir eine Verteilung, aber über 11.000 datasätze ist die Verteilung nicht das, was ich erwartet hatte:

 0 593 9 652 3 1324 6 1253 7 1293 1 1932 4 1325 5 1282 2 1295 8 635 

Ihre Ergebnisse erlauben Ihnen nur, 9 verschiedene Werte zu haben, weil Sie den module von 5 nehmen. Schauen Sie sich die folgenden Ergebnisse an. Wenn du fortfährst, den module zu nehmen, wirst du sehen, dass es keine ganze Zahl größer als 4 und nicht weniger als -4 sein kann (dies ist vor dem Hinzufügen der letzten +5). Es wird gerade anfangen zu schleifen. Stattdessen nehmen Sie nicht den module von 10 des absoluten Wertes des Bigint-Wertes des Binär-Hashs.

 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 

Versuchen Sie es stattdessen zu verwenden

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

Hier ist ein schönes Beispiel mit dem System Fehlermeldungen für einige randome Text.

 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 

Ergebnisse:

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

versuchen Sie unten Abfrage, es gibt mir verschiedene Hash-Wert als Ihre Anforderung:

 --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)