Função FNV_HASH - Amazon Redshift

Função FNV_HASH

Calcula a função de hash não criptográfica FNV-1a de 64 bits para todos os tipos de dados básicos.

Sintaxe

FNV_HASH(value [, seed])

Argumentos

value

O valor de entrada ao qual aplicar o hash. O Amazon Redshift usa a representação binária do valor para aplicar o hash ao valor de entrada; por exemplo, é aplicado hash aos valores INTEGER usando 4 bytes e aos valores BIGINT usando 8 bytes. Além disso, a aplicação do hash a entradas CHAR e VARCHAR não ignora espaços à esquerda.

semente

A semente BIGINT da função de hash é opcional. Se não for fornecida, o Amazon Redshift usará a semente FNV padrão. Isso permite combinar o hash de várias colunas sem conversões nem concatenações.

Tipo de retorno

BIGINT

Exemplo

Os exemplos a seguir retornam o hash FNV de um número, a string "Amazon Redshift" e a concatenação dos dois.

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)

Observações de uso

  • Para calcular o hash de uma tabela com várias colunas, é possível calcular o hash FNV da primeira coluna e transmiti-lo como uma semente para o hash da segunda coluna. Depois, ele passa o hash FNV da segunda coluna como uma semente para o hash da terceira coluna.

    O exemplo a seguir cria sementes para aplicar o hash a uma tabela com várias colunas.

    select fnv_hash(column_3, fnv_hash(column_2, fnv_hash(column_1))) from sample_table;
  • A mesma propriedade pode ser usada para calcular o hash de uma concatenação de strings.

    select fnv_hash('abcd'); fnv_hash --------------------- -281581062704388899 (1 row)
    select fnv_hash('cd', fnv_hash('ab')); fnv_hash --------------------- -281581062704388899 (1 row)
  • A função de hash usa o tipo de entrada para determinar o número de bytes para hash. Use a fundição para impor um tipo específico, se necessário.

    Os exemplos a seguir usam diferentes tipos de entrada para produzir resultados diferentes.

    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)