2017-04-20 6 views
4

Unsere Anwendung hat die folgende Tabellendefinition:Wie kann ich eine Spalte mit einem 0-9-Hash-Text in einer anderen Spalte erstellen?

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 für die EnglishHash Säule war ein Wert von entweder 0,1,2,3,4,5,6,7,8 oder 9 zu sein

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

kann mir jemand helfen, 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 zeichnet 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 
+1

nur neugierig, In welcher circumtances i so berechnetem columns.any Beispiel erstellen Sie können sogar Runde verwenden deklarieren @i nvarchar (250) = 'd' wählen abs (rund (CONVERT ([bigint], hashbytes ('md5', @ i)), 1)% (5)) – KumarHarsh

+0

Können Sie ple Zeigen Sie mir Ihre Daten in der Tabelle –

+0

Nun, da Sie eine Anforderung hinzugefügt haben, dass die statistische Verteilung "was ich erwartet habe" sein muss, was ist die Verteilung von '[English]' Werten? Es gibt keinen Hinweis darauf, dass sie einzigartig sind. – HABO

Antwort

9

Ihre Ergebnisse können Sie nur 9 unterschiedliche Werte haben, weil Sie das Modul von 5. Betrachten Sie die folgenden Ergebnisse einnehmen. Wenn Sie den Modulus weiter verwenden, sehen Sie, dass es keine ganze Zahl größer als 4 und nicht kleiner als -4 sein kann (dies ist vor dem Hinzufügen der letzten +5). Es wird nur mit dem Schleifen beginnen. Stattdessen nehmen Sie den Betrag von 10 des absoluten Wertes des bigint Wertes des binären Hashes.

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 sich mit diesem statt

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

Hier ist ein schönes Beispiel der Systemfehlermeldungen für einigen zufälligen 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 
+0

Danke, können Sie mir ein Beispiel dafür geben, wie ich die Linie ändern sollte, damit ich zwischen 0 und 9 wählen kann. – Alan2

+0

@Alan ich aktualisierte die Antwort – EMUEVIL

+0

@alan ich vermasselte eine Reihenfolge der Operationen Sache. Stellen Sie sicher, dass Sie den gleichen Wert wie in meinem bearbeiteten Post haben – EMUEVIL

1

Versuch unter Abfrage, es gibt mir verschiedenen 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) 
Verwandte Themen