- 카테고리:
HASH¶
부호 있는 64비트 해시 값을 반환합니다. HASH는 NULL 입력의 경우에도 절대로 NULL을 반환하지 않습니다.
HASH 함수의 가능한 용도는 다음과 같습니다.
치우친 데이터 값을 더 무작위로 또는 더 고르게 분포될 가능성이 있는 값으로 변환합니다.
예를 들어, 심하게 치우친 값 그룹을 해시하고, 무작위로 분포하거나 고르게 분포될 가능성이 더 큰 값 세트를 생성할 수 있습니다.
데이터를 버킷에 넣습니다. 해시는 편향된 데이터 값을 더 균일하게 분포된 값으로 변환할 수 있으므로, 해시를 사용하여 편향된 값을 가져오고, 대략적으로 고른 크기의 버킷을 만들 수 있습니다.
해시만으로는 원하는 고유 버킷 수를 얻을 수 없는 경우, 해시를 ROUND 또는 WIDTH_BUCKET 함수와 결합할 수 있습니다.
참고
HASH는 임의 형식으로 된 다양한 수의 입력 식을 수락하고, 서명된 값을 반환하는 독점 함수입니다. 암호화 해시 함수가 아니므로 그대로 사용해서는 안 됩니다.
암호화 해시 함수에는 이 함수에 없는 몇 가지 속성이 있습니다. 예를 들면 다음과 같습니다.
값의 암호화 해시는 원래 값을 찾기 위해 반전될 수 없습니다.
값이 주어진 경우, 동일한 암호화 해시를 사용하여 또 다른 값을 찾는 것이 불가능합니다.
암호화 목적의 경우, SHA 함수 집합(문자열 및 이진 함수)을 사용하십시오.
- 참고 항목:
구문¶
HASH( <expr> [ , <expr2> ... ] )
HASH(*)
인자¶
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 |
----------------------+
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 |
---------------------+------------------------+-----------------------+---------------------+
SELECT HASH(10), HASH('10');
---------------------+---------------------+
HASH(10) | HASH('10') |
---------------------+---------------------+
1599627706822963068 | 3622494980440108984 |
---------------------+---------------------+
SELECT HASH(null), HASH(null, null), HASH(null, null, null);
---------------------+--------------------+------------------------+
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;
----------------------+
HASH(*) |
----------------------+
-3527903796973745449 |
6296330861892871310 |
6918165900200317484 |
-2762842444336053314 |
-2340602249668223387 |
5248970923485160358 |
-5807737826218607124 |
428973568495579456 |
2583438210124219420 |
4041917286051184231 |
----------------------+