Para funções hash criptográficas modernas, não, não há predicado de proximidade computável com eficiência, assumindo a distribuição em xtem entropia suficiente. A intuição é que essas funções de hash são projetadas para "não ter estrutura", para que não admitam nada assim.
Em termos técnicos, as funções hash criptográficas modernas se comportam "como um oráculo aleatório". Para um oráculo aleatório, não existe esse predicado de proximidade: o melhor que você pode fazer é inverter a função hash e, em seguida, enumerar todas as strings próximas e as hash. Como resultado, não há como fazer isso para funções hash criptográficas modernas.
Heuristicamente, é possível projetar uma função de hash personalizada que admita um predicado de proximidade eficiente e que é (aproximadamente) o mais seguro possível, considerando esse fato. Vamos supor que as strings que vamos hash tenham comprimento fixo. Suponha que tenhamos um bom código de correção de erros e permitaD seja o algoritmo de decodificação (para mapear uma cadeia de bits para uma palavra de código próxima, se possível).
Para obter um esquema simples, mas imperfeito, imagine definir h ( x ) = SHA256 ( D ( x ) ). E sex , y são duas seqüências aleatórias suficientemente próximas, então há uma chance decente de h ( x ) = h ( y). E sex , y não estão perto, então h ( x ) não será nada parecido h ( y), e não obteremos informações além do fato de que x , ynão estão perto. Isto é simples. No entanto, também é imperfeito. Existem muitos paresx , y que estão próximos, mas onde não podemos detectar esse fato h ( x ) , h ( y) (por exemplo, porque a função de decodificação D falha).
Heuristicamente, parece possível melhorar essa construção. Em tempo de design, escolha seqüências de bits aleatóriasr1, ... ,rk. Agora, defina a seguinte função de hash:
h ( x ) = ( SHA256 ( D ( x ⊕r1) , … , SHA256 ( D ( x ⊕rk) ) .
Agora se x , y suficientemente perto, é provável que exista Eu de tal modo que D ( x ⊕rEu) = D ( y⊕rEu)e assim h ( x)Eu= h ( y)Eu. Isso sugere imediatamente um predicado de proximidade: seh ( x ) fósforos h ( y) em qualquer um de seus k componentes, então x , ysão próximos; caso contrário, deduza que eles não estão próximos.
Se você deseja adicionalmente resistência à colisão, uma construção simples é a seguinte: deixe h1( ⋅ )ser uma função hash com um predicado de proximidade; entãoh ( x ) = (h1( x ) , SHA256 ( x ) ) é resistente a colisões (qualquer colisão para isso também é uma colisão para o SHA256) e tem um predicado de proximidade (basta usar o predicado de proximidade para h1) Você pode deixarh1( ⋅ ) seja a função hash definida acima.
Isso é tudo para a distância de Hamming. A distância de edição é provavelmente significativamente mais difícil.
Ao apresentar a construção acima, fui inspirado pelo seguinte artigo:
Ari Juels, Martin Wattenberg. Um Esquema de Compromisso Difuso .
Ari Juels, Madhi Sudhan. Um esquema de cofre difuso . Designs, Codes and Cryptography 38 (2): 237-257, 2006.
Aliás: na criptografia, as funções de hash não são codificadas. Se você deseja algo com chave, pode dar uma olhada nas funções pseudo-aleatórias.