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