HASH

HASH

부호 있는 64비트 해시 값을 반환하는 함수예요. NULL 입력에도 NULL이 아닌 해시 값을 돌려준다는 특징이 있어요. 치우친 데이터를 고르게 분산시키거나 버킷을 만들 때 유용합니다.

출처: Snowflake SQL Reference

본문

HASH는 임의 타입의 여러 개 입력 표현식을 받아 부호 있는 값을 반환하는 Snowflake 독자 함수예요. 암호화 해시 함수가 아니므로 그렇게 사용하면 안 됩니다. 암호화 용도라면 문자열·이진 함수의 SHA 계열 함수를 쓰세요.

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

HASH(*)

인자

  • expr: 모든 Snowflake 데이터 타입의 일반 표현식이에요.
  • *: 각 레코드의 모든 컬럼을 기준으로 단일 해시 값을 반환해요(NULL 값을 가진 레코드 포함). 와일드카드에 테이블 이름이나 별칭을 붙일 수 있어요(예: (mytable.*)). ILIKE와 EXCLUDE 키워드로 필터링도 가능해요.
    • (* ILIKE 'col1%') — 지정한 패턴과 일치하는 컬럼 이름만 필터링(패턴 하나만 허용).
    • (* EXCLUDE col1), (* EXCLUDE (col1, col2)) — 지정한 컬럼을 제외.
    • ILIKE와 EXCLUDE는 한 번의 호출에서 함께 쓸 수 없고, SELECT 목록이나 GROUP BY 절에서만 유효해요.

반환 타입은 부호 있는 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를 고유 키 생성에 사용하지 마세요. 64비트의 한정된 해상도라 2^64개보다 많은 값이 들어가면 비고유 값을 반환하기가 보장돼요. 실용적으로 입력이 2^32행(약 40억 행) 이상이면 적어도 하나의 중복 값이 나올 가능성이 커요.

컬레이션 영향: 없음. 문자열만 해시 값에 영향을 주고 컬레이션 지정은 영향을 주지 않아요.

예시

SELECT HASH(SEQ8()) FROM TABLE(GENERATOR(rowCount=>10));
+----------------------+
|         HASH(SEQ8()) |
|----------------------|
| -6076851061503311999 |
| -4730168494964875235 |
| -3690131753453205264 |
| ...
+----------------------+

같은 값을 다른 타입으로 해시했을 때 결과가 같은지도 확인해 볼 수 있어요.

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 |
+---------------------+------------------------+-----------------------+---------------------+

더 알아보기 (Learn more)