카테고리:

해시 함수

HASH

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

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

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

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

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

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

참고

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

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

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

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

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

참고 항목:

HASH_AGG

구문

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

HASH(*)
Copy

인자

expr

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

*

NULL 값이 있는 레코드를 포함하여 각 레코드의 모든 열을 기반으로 해시된 단일 값을 반환합니다.

함수에 와일드카드를 전달할 때 와일드카드를 테이블의 이름이나 별칭으로 한정할 수 있습니다. 예를 들어, mytable 이라는 테이블의 모든 열을 전달하려면 다음을 지정하십시오.

(mytable.*)
Copy

필터링을 위해 ILIKE 및 EXCLUDE 키워드를 사용할 수도 있습니다.

  • ILIKE는 지정된 패턴과 일치하는 열 이름을 필터링합니다. 패턴은 하나만 허용됩니다. 예:

    (* ILIKE 'col1%')
    
    Copy
  • EXCLUDE는 지정된 열과 일치하지 않는 열 이름을 걸러냅니다. 예:

    (* EXCLUDE col1)
    
    (* EXCLUDE (col1, col2))
    
    Copy

이러한 키워드를 사용할 경우 한정자가 유효합니다. 다음 예에서는 ILIKE 키워드를 사용하여 테이블 mytable 의 패턴 col1% 와 일치하는 모든 열을 필터링합니다.

(mytable.* ILIKE 'col1%')
Copy

ILIKE 및 EXCLUDE 키워드는 단일 함수 호출에서 결합할 수 없습니다.

이 함수의 경우 ILIKE 및 EXCLUDE 키워드는 SELECT 목록이나 GROUP BY 절에서만 유효합니다.

ILIKE 및 EXCLUDE 키워드에 대한 자세한 내용은 SELECT 의 “매개 변수” 섹션을 참조하십시오.

반환

부호 있는 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));
Copy
+----------------------+
|         HASH(SEQ8()) |
|----------------------|
| -6076851061503311999 |
| -4730168494964875235 |
| -3690131753453205264 |
| -7287585996956442977 |
| -1285360004004520191 |
|  4801857165282451853 |
| -2112898194861233169 |
|  1885958945512144850 |
| -3994946021335987898 |
| -3559031545629922466 |
+----------------------+
SELECT HASH(10), HASH(10::number(38,0)), HASH(10::number(5,3)), HASH(10::float);
Copy
+---------------------+------------------------+-----------------------+---------------------+
|            HASH(10) | HASH(10::NUMBER(38,0)) | HASH(10::NUMBER(5,3)) |     HASH(10::FLOAT) |
|---------------------+------------------------+-----------------------+---------------------|
| 1599627706822963068 |    1599627706822963068 |   1599627706822963068 | 1599627706822963068 |
+---------------------+------------------------+-----------------------+---------------------+
SELECT HASH(10), HASH('10');
Copy
+---------------------+---------------------+
|            HASH(10) |          HASH('10') |
|---------------------+---------------------|
| 1599627706822963068 | 3622494980440108984 |
+---------------------+---------------------+
SELECT HASH(null), HASH(null, null), HASH(null, null, null);
Copy
+---------------------+--------------------+------------------------+
|          HASH(NULL) |   HASH(NULL, NULL) | HASH(NULL, NULL, NULL) |
|---------------------+--------------------+------------------------|
| 8817975702393619368 | 953963258351104160 |    2941948363845684412 |
+---------------------+--------------------+------------------------+

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

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

...

SELECT HASH(*) FROM orders LIMIT 10;
Copy
+-----------------------+
|        HASH(*)        |
|-----------------------|
|  -3527903796973745449 |
|  6296330861892871310  |
|  6918165900200317484  |
|  -2762842444336053314 |
|  -2340602249668223387 |
|  5248970923485160358  |
|  -5807737826218607124 |
|  428973568495579456   |
|  2583438210124219420  |
|  4041917286051184231  |
+ ----------------------+