Eu estou tentando pensar em uma boa função de hash para strings. E eu estava pensando que seria uma boa idéia resumir os valores unicode para os cinco primeiros caracteres da string (supondo que ele possua cinco, caso contrário, pare onde termina). Seria uma boa ideia ou ruim?
Estou fazendo isso em Java, mas não imaginaria que isso faria muita diferença.
String
os seushashCode()
?Respostas:
Geralmente, os hashes não fazem somas, caso contrário,
stop
epots
terão o mesmo hash.e você não o limitaria aos primeiros n caracteres porque, caso contrário, house e houses teriam o mesmo hash.
Geralmente, os hashs pegam valores e multiplicam-no por um número primo (aumenta a probabilidade de gerar hashes exclusivos). Assim, você pode fazer algo como:
fonte
Se é algo de segurança, você pode usar criptografia Java:
fonte
Você provavelmente deve usar String.hashCode () .
Se você realmente deseja implementar o hashCode você mesmo:
Usar apenas os cinco primeiros caracteres é uma má ideia . Pense em nomes hierárquicos, como URLs: todos eles terão o mesmo código de hash (porque todos começam com "http: //", o que significa que eles são armazenados no mesmo bucket em um mapa de hash, exibindo um desempenho terrível.
Aqui está uma história de guerra parafraseada no hashCode String de " Java Efetivo ":
fonte
Se você está fazendo isso em Java, por que está fazendo isso? Basta chamar
.hashCode()
a cordafonte
.hashCode()
. Em vez disso, use algum algoritmo conhecido.String::hashCode
é especificado no JDK, portanto é tão portátil quanto a própria existência da classejava.lang.String
.O goiaba
HashFunction
( javadoc ) fornece um hash decente não forte em criptografia.fonte
404
d.Essa função fornecida por Nick é boa, mas se você usar a nova String (byte [] bytes) para fazer a transformação em String, ela falhará. Você pode usar esta função para fazer isso.
Pode ser que isso possa ajudar alguém
fonte
lógica de origem por trás da função hash djb2 - SO
fonte
Há rumores de que o FNV-1 é uma boa função de hash para strings.
Para cadeias longas (com mais de, digamos, cerca de 200 caracteres), é possível obter um bom desempenho da função de hash MD4 . Como uma função criptográfica, ela foi quebrada cerca de 15 anos atrás, mas, para fins não criptográficos, ainda é muito boa e surpreendentemente rápida. No contexto de Java, você teria que converter os
char
valores de 16 bits em palavras de 32 bits, por exemplo, agrupando esses valores em pares. Uma implementação rápida do MD4 em Java pode ser encontrada no sphlib . Provavelmente exagere no contexto de uma tarefa em sala de aula, mas vale a pena tentar.fonte
Se você quiser ver as implementações padrão do setor, consulte java.security.MessageDigest .
"Os resumos de mensagens são funções de hash unidirecionais seguras que pegam dados de tamanho arbitrário e emitem um valor de hash de tamanho fixo".
fonte
aqui está um link que explica muitas funções hash diferentes, por enquanto eu prefiro a função hash ELF para o seu problema específico. Toma como entrada uma sequência de comprimento arbitrário.
fonte
sdbm: esse algoritmo foi criado para a biblioteca de banco de dados sdbm (uma reimplementação de domínio público do ndbm)
fonte
fonte
É uma boa idéia trabalhar com número ímpar ao tentar desenvolver uma boa função de hast para string. Essa função pega uma string e retorna um valor de índice, até agora funciona muito bem. e tem menos colisão. o índice varia de 0 a 300, talvez até mais do que isso, mas ainda não cheguei mais alto, mesmo com palavras longas como "engenharia eletromecânica"
Outra coisa que você pode fazer é multiplicar cada caractere analisado pelo índice, à medida que aumenta como a palavra "urso" (0 * b) + (1 * e) + (2 * a) + (2 * a) + (3 * r), o que lhe dará um valor int para brincar. a primeira função de hash acima colide em "aqui" e "ouça", mas ainda é ótima em fornecer bons valores exclusivos. o abaixo não colide com "aqui" e "ouve" porque eu multiplico cada caractere pelo índice à medida que aumenta.
fonte
Aqui está uma função de hash simples que eu uso para uma tabela de hash que criei. É basicamente para pegar um arquivo de texto e armazenar todas as palavras em um índice que representa a ordem alfabética.
O que isso basicamente faz é que as palavras sejam hash de acordo com a primeira letra. Assim, a palavra que começa com 'a' obteria uma chave de hash 0, 'b' obteria 1 e assim por diante e 'z' seria 25. Números e símbolos teriam uma chave de hash 26. Essa é uma vantagem oferecida ; Você pode calcular fácil e rapidamente onde uma determinada palavra seria indexada na tabela de hash, pois está tudo em ordem alfabética, algo como isto: Código pode ser encontrado aqui: https://github.com/abhijitcpatil/general
Esta seria a saída:
fonte
Isso evitará qualquer colisão e será rápido até usarmos a mudança nos cálculos.
fonte