A seguir, usamos o N4140 (C ++ 14 Standard).
De acordo com o § 17.6.3.4 Requisitos de hash ,
O valor retornado dependerá apenas do argumento
k
durante a duração do programa .[Nota: Assim, todas as avaliações da expressão
h(k)
com o mesmo valor parak
produzem o mesmo resultado para uma determinada execução do programa . - nota final]
e § 20.9.12 o hash do modelo de classe diz
...
a instanciação
hash<Key>
deve:(1.1) - satisfazer os requisitos de Hash (17.6.3.4) ...
(1,2) - ...
Isso significa que um valor de hash de value
(ou seja hash<decltype(value)>(value)
) pode assumir um valor diferente se você reiniciar o programa.
Mas por que? Essa limitação não estava no padrão de C ++ 11, mas no padrão de C ++ 14, C ++ 17 e C ++ 20. Como usuário (não desenvolvedor de STL), seria bastante útil se std::hash
fosse determinístico. Existem dificuldades matemáticas na implementação de uma função hash determinística? Mas as funções de hash que usamos diariamente (por exemplo, obsoletas md5sum
ou mais seguras sha256
) são todas determinísticas. Existe um problema de eficiência?
fonte
Respostas:
Não é necessário que a função hash seja determinística entre as execuções, mas você ainda pode fornecer seu próprio hash, por exemplo, para contêineres não ordenados, se for um comportamento em que você confia.
Quanto ao porquê, a cppreference diz:
Se os
Hash
requisitos indicarem que é determinístico, você não poderá fornecer um hash salgado sem violar o requisito.Aqui está a explicação real por que
fonte
Esta resposta (e links) sugerida por @NathanOliver é finalmente útil. Deixe-me citar partes importantes.
PS
Acabei de pesquisar no "hash table dos" e encontrei uma página informativa: o momento em que você percebe que todos os servidores do mundo são vulneráveis .
fonte