Ich muss einen Hash-Schlüssel auf meine Tabellen für Eindeutigkeit erstellen und jemand erwähnte mich über md5. Aber ich habe über Prüfsummen und Binärsummen gelesen; würde dies nicht den gleichen Zweck erfüllen? Um sicherzustellen, dass es keine Duplikate in einem bestimmten Feld gibt. Jetzt ist es mir gelungen, dies zu implementieren, und ich sehe die Hask-Schlüssel in meinen Tabellen. Muss ich die ursprünglich erstellten Indexschlüssel ändern, da ich einen neuen Indexschlüssel mit diesen Hash-Schlüsseln erstellt habe? Muss ich auch die Schlüssel ändern? Wie ändere ich meine Abfragen, zum Beispiel SELECT-Anweisungen? Ich bin mir immer noch nicht sicher, wie Hash-Schlüssel bei Abfragen wirklich helfen, abgesehen von der Einzigartigkeit?
Antworten
Zu viele Anzeigen?Es macht keinen Sinn, eine eindeutige Funktion zu schreiben, um eindeutige SQL Server-Einschränkungen/Indizes zu ersetzen.
Wie wollen Sie sicherstellen, dass der Hash eindeutig ist? Mit einer Einschränkung?
Wenn Sie es indizieren (was aufgrund des Determinismus nicht zulässig ist), wird es vom Optimierer als nicht eindeutig behandelt. Außerdem wird die Leistung beeinträchtigt.
Und Sie haben nur ein paar 100.000 Zeilen. Erdnüsse.
Wenn ich mehr Zeit hätte, könnte ich noch mehr Argumente anführen, aber ich fasse mich kurz: Tun Sie es nicht
Es gibt immer die HashBytes() Funktion. Sie unterstützt md5, aber wenn Sie das nicht mögen, gibt es eine Option für sha1.
Ein einfaches Beispiel ist, wenn Sie eine große varchar-Spalte haben - vielleicht varchar max - und in Ihrer Abfrage wissen wollen, ob der Inhalt dieser Spalte mit einer bestimmten Zeichenfolge übereinstimmt. Wenn Sie Ihre Suche mit jedem einzelnen Datensatz vergleichen müssen, könnte das langsam sein. Wenn Sie jedoch einen Hash für Ihre Suchzeichenfolge verwenden, geht alles viel schneller, da es sich nur noch um einen sehr kurzen binären Vergleich handelt.
Kryptografisch sichere Hash-Funktionen sind Einwegfunktionen und verbrauchen mehr Ressourcen (CPU-Zyklen) als Funktionen, die nicht kryptografisch sicher sind. Wenn Sie die Funktion nur als Hash-Schlüssel benötigen, brauchen Sie diese Eigenschaft nicht. Alles, was Sie brauchen, ist eine geringe Wahrscheinlichkeit für Kollisionen, was mit der Uniformität zusammenhängt. Versuchen Sie es mit CRC oder wenn Sie Strings oder Modulo für Zahlen haben.
Warum verwenden Sie nicht eine GUID mit einem Standardwert von NEWSEQUENTIALID() verwenden Sie nicht NEWID(), da es für die Clusterbildung schrecklich ist, siehe hier: Bewährte Praxis: Nicht auf UniqueIdentifier clustern, wenn Sie NewId verwenden
Machen Sie diese Spalte zum Primärschlüssel und Sie sind so gut wie fertig.