카테고리:

해시 함수

HASH

부호 있는 64비트 해시 값을 반환합니다. HASH는 NULL 입력의 경우에도 절대로 NULL을 반환하지 않습니다.

HASH 함수의 가능한 용도는 다음과 같습니다.

  • 치우친 데이터 값을 더 무작위로 또는 더 고르게 분포될 가능성이 있는 값으로 변환합니다.

    예를 들어, 심하게 치우친 값 그룹을 해시하고, 무작위로 분포하거나 고르게 분포될 가능성이 더 큰 값 세트를 생성할 수 있습니다.

  • 데이터를 버킷에 넣습니다. 해시는 편향된 데이터 값을 더 균일하게 분포된 값으로 변환할 수 있으므로, 해시를 사용하여 편향된 값을 가져오고, 대략적으로 고른 크기의 버킷을 만들 수 있습니다.

    해시만으로는 원하는 고유 버킷 수를 얻을 수 없는 경우, 해시를 ROUND 또는 WIDTH_BUCKET 함수와 결합할 수 있습니다.

참고

HASH는 임의 형식으로 된 다양한 수의 입력 식을 수락하고, 서명된 값을 반환하는 독점 함수입니다. 암호화 해시 함수가 아니므로 그대로 사용해서는 안 됩니다.

암호화 해시 함수에는 이 함수에 없는 몇 가지 속성이 있습니다. 예를 들면 다음과 같습니다.

  • 값의 암호화 해시는 원래 값을 찾기 위해 반전될 수 없습니다.

  • 값이 주어진 경우, 동일한 암호화 해시를 사용하여 또 다른 값을 찾는 것이 불가능합니다.

암호화 목적의 경우, SHA 함수 집합(문자열 및 이진 함수)을 사용하십시오.

참고 항목

HASH_AGG

구문

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

HASH(*)
Copy

인자

exprN

식은 모든 Snowflake 데이터 타입의 일반 식일 수 있습니다.

반환

부호 있는 64비트 값을 NUMBER(19,0)으로서 반환합니다.

HASH는 NULL 입력의 경우에도 절대로 NULL을 반환하지 않습니다.

사용법 노트

  • HASH는 다음을 보장한다는 점에서 안정적입니다.

    • 동등하게 비교되는 NUMBER 형식의 두 값은 각 유형의 정밀도 및/또는 스케일이 다른 경우에도 동일 해시 값으로 해시됩니다.

    • 정밀도 손실 없이 NUMBER(38, 0)으로 변환할 수 있는 FLOAT 형식의 두 값은 동일한 값으로 해시됩니다. 예를 들어 다음은 모두 동일 해시 값을 반환합니다.

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

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

      • HASH(10::FLOAT)

    • 동일하게 비교되는 TIMESTAMP_TZ 형식의 두 값은 다른 타임존에서 타임스탬프가 온 경우에도 동일 해시 값으로 해시됩니다.

    • 이 보장은 VARIANT 열 내의 NUMBER, FLOAT, TIMESTAMP_TZ 값에도 적용됩니다.

    • 형식 간에 암시적 변환이 존재하더라도 이 보장은 다른 형식 조합에는 적용되지 않습니다. 예를 들어, 다음은 암시적 변환 후 10 = '10' 이더라도 압도적 확률로, 동일 해시 값을 반환하지 않습니다.

      • HASH(10)

      • HASH('10')

  • HASH(*) 는 행의 모든 열을 기반으로 단일 해시 값을 만드는 것을 의미합니다.

  • HASH()를 사용하여 고유 키를 만들지 마십시오. HASH()는 64비트의 유한 해상도를 가지며, 2^64개가 넘는 값이 입력될 경우(예: 2^64개가 넘는 행이 있는 테이블의 경우), 고유하지 않은 값을 반환하도록 보장됩니다. 실제로, 입력이 2^32개 행(약 40억 개 행) 이상인 경우, 함수는 최소한 하나의 중복 값을 반환할 가능성이 합리적으로 높습니다.

데이터 정렬 세부 정보

No impact.

  • 동일하지만 데이터 정렬 사양이 다른 두 문자열은 같은 해시 값을 갖습니다. 즉, 데이터 정렬 사양이 아니라 문자열만 해시 값에 영향을 줍니다.

  • 서로 다르지만 데이터 정렬에 따라 동일하게 비교되는 두 문자열은 다른 해시 값을 가질 수 있습니다. 예를 들어, 구두점을 구분하지 않는 데이터 정렬을 사용하는 동일한 두 문자열은 일반적으로, 다른 해시 값을 갖게 됩니다. 데이터 정렬 사양이 아니라 문자열만 해시 값에 영향을 미치기 때문입니다.

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

아래 예는 테이블에 여러 열이 포함된 경우에도 HASH(*) 가 행당 단일 값을 반환함을 보여줍니다.

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