Kategorien:

Hashfunktionen

HASH

Gibt einen signierten 64-Bit-Hashwert zurück. Beachten Sie, dass HASH niemals NULL zurückgibt, selbst bei NULL-Eingaben.

Mögliche Verwendungsmöglichkeiten für die HASH-Funktion sind:

  • Konvertieren von verzerrten Datenwerten in Werte, die zufälliger oder gleichmäßiger verteilt sind.

    Sie können beispielsweise die Hashfunktion auf einer Gruppe von stark verzerrten Werten ausführen und ein Set von Werten generieren, die zufälliger sind oder gleichmäßiger verteilt.

  • Daten in Buckets speichern. Da das Hashing verzerrte Datenwerte in gleichmäßig verteilte Werte konvertieren kann, können Sie das Hashing verwenden, um für verzerrte Werte annähernd gleich große Buckets zu erstellen.

    Wenn das Hashing alleine nicht ausreicht, um die gewünschte Anzahl an unterschiedlichen Buckets zu erhalten, können Sie das Hashing mit den Funktionen ROUND oder WIDTH_BUCKET kombinieren.

Bemerkung

HASH ist eine proprietäre Funktion, die eine variable Anzahl von Eingabeausdrücken beliebiger Typen akzeptiert und einen signierten Wert zurückgibt. Dies ist keine kryptografische Hashfunktion und sollte nicht als solche verwendet werden.

Kryptografische Hashfunktionen weisen einige Eigenschaften auf, die diese Funktion nicht hat, zum Beispiel:

  • Das kryptografische Hashing eines Werts kann nicht invertiert werden, um den ursprünglichen Wert zu finden.

  • Bei einem gegebenen Wert ist es unmöglich, mit demselben kryptografischen Hash einen anderen Wert zu finden.

Nutzen Sie für kryptografische Zwecke die SHA-Funktionsfamilie (siehe Zeichenfolgen- und Binärfunktionen).

Siehe auch:

HASH_AGG

Syntax

HASH( <expr> [ , <expr2> ... ] )

HASH(*)
Copy

Argumente

exprN

Der Ausdruck kann ein allgemeiner Ausdruck eines beliebigen Snowflake-Datentyps sein.

Rückgabewerte

Gibt einen vorzeichenbehafteten 64-Bit-Wert als NUMBER(19,0) zurück.

HASH gibt niemals NULL zurück, selbst bei NULL-Eingaben.

Nutzungshinweise

  • HASH ist stabil in dem Sinne, dass Folgendes garantiert ist:

    • Zwei beliebige Werte vom Typ NUMBER, die im Vergleich Gleichheit ergeben, ergeben auch den gleichen Hashwert, selbst wenn die jeweiligen Typen eine unterschiedliche Genauigkeit und/oder Skalierung aufweisen.

    • Zwei beliebige Werte vom Typ FLOAT, die ohne Genauigkeitsverlust in NUMBER(38, 0) konvertiert werden können, haben denselben Hash-Wert. Beispielsweise geben alle folgende Funktionen denselben Hashwert zurück:

      • HASH(10::NUMBER(38,0))

      • HASH(10::NUMBER(5,3))

      • HASH(10::FLOAT)

    • Zwei beliebige Werte vom Typ TIMESTAMP_TZ, die im Vergleich Gleichheit ergeben, ergeben auch den gleichen Hashwert, selbst wenn die Zeitstempel aus unterschiedlichen Zeitzonen sind.

    • Diese Garantie gilt auch für NUMBER-, FLOAT- und TIMESTAMP_TZ-Werte in einer VARIANT-Spalte.

    • Diese Garantie gilt nicht für andere Kombinationen von Typen, auch wenn es implizite Konvertierungen zwischen den Typen gibt. Mit sehr hoher Wahrscheinlichkeit geben folgende Funktionen beispielsweise nicht dieselben Hashwerte zurück, obwohl nach impliziter Konvertierung 10 = '10' ist.

      • HASH(10)

      • HASH('10')

  • HASH(*) bedeutet, einen einzelnen Hashwert basierend auf allen Spalten in der Zeile zu erstellen.

  • Verwenden Sie nicht HASH(), um eindeutige Schlüssel zu erstellen. HASH() hat eine endliche Auflösung von 64 Bit und liefert garantiert nicht eindeutige Werte, wenn mehr als 264 Werte eingegeben werden (z. B. für eine Tabelle mit mehr als 2^64 Zeilen). In der Praxis ist es vernünftigerweise wahrscheinlich, dass die Funktion mindestens einen doppelten Wert zurückgibt, wenn die Eingabe bei einer Größenordnung von 2^32 Zeilen (ungefähr 4 Milliarden Zeilen) oder mehr liegt.

Sortierungsdetails

No impact.

  • Zwei identische Zeichenfolgen mit unterschiedlichen Sortierungsspezifikationen haben denselben Hashwert. Mit anderen Worten: Nur die Zeichenfolge, nicht die Sortierungsspezifikation, wirkt sich auf den Hashwert aus.

  • Zwei Zeichenfolgen, die unterschiedlich sind, aber gemäß einer Sortierung gleich sind, können unterschiedliche Hashwerte aufweisen. Beispielsweise haben zwei Zeichenfolgen, die bei Verwendung einer Sortierung ohne Berücksichtigung von Satzzeichen identisch sind, normalerweise unterschiedliche Hashwerte, da sich nur die Zeichenfolge und nicht die Sortierungsspezifikation auf den Hashwert auswirkt.

Beispiele

SELECT HASH(SEQ8()) FROM TABLE(GENERATOR(rowCount=>10));

----------------------+
     HASH(SEQ8())     |
----------------------+
 -6076851061503311999 |
 -4730168494964875235 |
 -3690131753453205264 |
 -7287585996956442977 |
 -1285360004004520191 |
 4801857165282451853  |
 -2112898194861233169 |
 1885958945512144850  |
 -3994946021335987898 |
 -3559031545629922466 |
----------------------+
Copy
SELECT HASH(10), HASH(10::number(38,0)), HASH(10::number(5,3)), HASH(10::float);

---------------------+------------------------+-----------------------+---------------------+
      HASH(10)       | HASH(10::NUMBER(38,0)) | HASH(10::NUMBER(5,3)) |   HASH(10::FLOAT)   |
---------------------+------------------------+-----------------------+---------------------+
 1599627706822963068 | 1599627706822963068    | 1599627706822963068   | 1599627706822963068 |
---------------------+------------------------+-----------------------+---------------------+
Copy
SELECT HASH(10), HASH('10');

---------------------+---------------------+
      HASH(10)       |     HASH('10')      |
---------------------+---------------------+
 1599627706822963068 | 3622494980440108984 |
---------------------+---------------------+
Copy
SELECT HASH(null), HASH(null, null), HASH(null, null, null);

---------------------+--------------------+------------------------+
     HASH(NULL)      |  HASH(NULL, NULL)  | HASH(NULL, NULL, NULL) |
---------------------+--------------------+------------------------+
 8817975702393619368 | 953963258351104160 | 2941948363845684412    |
---------------------+--------------------+------------------------+
Copy

Das folgende Beispiel zeigt, dass HASH(*) auch dann einen einzelnen Wert pro Zeile zurückgibt, wenn die Tabelle mehrere Spalten enthält.

CREATE TABLE orders (order_ID INTEGER, customer_ID INTEGER, order_date ...);

...

SELECT HASH(*) FROM orders LIMIT 10;

----------------------+
       HASH(*)        |
----------------------+
 -3527903796973745449 |
 6296330861892871310  |
 6918165900200317484  |
 -2762842444336053314 |
 -2340602249668223387 |
 5248970923485160358  |
 -5807737826218607124 |
 428973568495579456   |
 2583438210124219420  |
 4041917286051184231  |
----------------------+
Copy