FNV_HASH 函数
计算所有基本数据类型的 64 位 FNV-1a 非加密哈希函数。
语法
FNV_HASH(value [, seed])
参数
- 值
-
要进行哈希处理的输入值。Amazon Redshift 使用值的二进制表示形式来对输入值进行哈希处理;例如,使用 4 个字节对 INTEGER 值进行哈希处理,使用 8 个字节对 BIGINT 值进行哈希处理。此外,对 CHAR 和 VARCHAR 输入进行哈希处理不会忽略尾随空格。
- 种子
-
哈希函数的 BIGINT 种子是可选的。如果未给定,Amazon Redshift 使用默认 FNV 种子。这样可以组合多个列的哈希,而无需任何转换或联接。
返回类型
BIGINT
示例
以下示例返回数字的 FNV 哈希值、字符串“Amazon Redshift”以及两者的联接。
select fnv_hash(1); fnv_hash ---------------------- -5968735742475085980 (1 row)
select fnv_hash('Amazon Redshift'); fnv_hash --------------------- 7783490368944507294 (1 row)
select fnv_hash('Amazon Redshift', fnv_hash(1)); fnv_hash ---------------------- -2202602717770968555 (1 row)
使用说明
要计算具有多列的表的哈希,可以计算第一列的 FNV 哈希,并将其作为种子传递给第二列的哈希。然后,它将第二列的 FNV 哈希作为种子传递给第三列的哈希。
以下示例创建种子来对包含多列的表进行哈希处理。
select fnv_hash(column_3, fnv_hash(column_2, fnv_hash(column_1))) from sample_table;
同一个属性可用于计算字符串联接的哈希。
select fnv_hash('abcd'); fnv_hash --------------------- -281581062704388899 (1 row)
select fnv_hash('cd', fnv_hash('ab')); fnv_hash --------------------- -281581062704388899 (1 row)
哈希函数使用输入的类型来确定要进行哈希处理的字节数。如有必要,使用强制转换来强制特定类型。
以下示例使用不同类型的输入来生成不同的结果。
select fnv_hash(1::smallint); fnv_hash -------------------- 589727492704079044 (1 row)
select fnv_hash(1); fnv_hash ---------------------- -5968735742475085980 (1 row)
select fnv_hash(1::bigint); fnv_hash ---------------------- -8517097267634966620 (1 row)