Estou essencialmente preparando frases para serem colocadas no banco de dados, pois elas podem estar malformadas, então, em vez disso, quero armazenar um pequeno hash (simplesmente compararei se elas existem ou não, para que o hash seja ideal).
Eu suponho que o MD5 seja bastante lento em mais de 100.000 solicitações, então eu queria saber qual seria o melhor método para fazer o hash das frases, talvez lançar minha própria função de hash ou usar hash('md4', '...'
seria mais rápido no final?
Eu sei que o MySQL tem MD5 (), então isso complementaria um pouco de velocidade no final da consulta, mas talvez haja mais uma função de hash mais rápida no MySQL que eu não conheço que funcionaria com PHP.
Respostas:
O CRC32 é bem rápido e existe uma função para ele: http://www.php.net/manual/en/function.crc32.php
Mas você deve estar ciente de que o CRC32 terá mais colisões que os hashes MD5 ou mesmo SHA-1, simplesmente por causa do comprimento reduzido (32 bits em comparação com 128 bits, respectivamente, 160 bits). Mas se você quiser apenas verificar se uma sequência armazenada está corrompida, você ficará bem com o CRC32.
fonte
E o código usado para gerar isso é:
fonte
hash_algos()
. O seguinte código de benchmarking de hash estava nos comentários do PHP ==> codepad.viper-7.com/5Wdhw6md5
são mais rápidos. Um teste melhor será aleatorizar também o conteúdo e o comprimento das strings. Dessa forma, temos uma idéia melhor sobre o desempenho real do mundo real. Isso também evitará o armazenamento em cache. Dê uma olhada: php hashing checksum performance #Lista classificada em que cada loop compartilha a mesma coisa para criptografar que todos os outros.
E a saída
fonte
strlen($characters)
deve serstrlen($characters) - 1
:)Há uma comparação de velocidade no site xxhash. Copie e cole aqui:
Parece que o xxHash é de longe o mais rápido, enquanto muitos outros batem em hashes mais antigos, como CRC32, MD5 e SHA.
https://code.google.com/p/xxhash/
Observe que este é o pedido em uma compilação de 32 bits. Em uma compilação de 64 bits, a ordem de desempenho provavelmente é muito diferente. Alguns dos hashes são fortemente baseados em multiplicações e buscas de 64 bits.
fonte
Parece que o crc32 é mais rápido para mensagens pequenas (nesse caso, 26 caracteres) e o md5 para mensagens mais longas (nesse caso,> 852 caracteres).
fonte
Atualização de 2019: esta resposta é a mais atualizada. As bibliotecas para apoiar o murmúrio estão amplamente disponíveis para todos os idiomas.
A recomendação atual é usar o Murmur Hash Família (ver especificamente o murmur2 ou murmur3 variantes).
Os hashes de Murmur foram projetados para o hash rápido com colisões mínimas (muito mais rápidas que CRC, MDx e SHAx). É perfeito procurar duplicatas e muito apropriado para índices HashTable.
De fato, é usado por muitos bancos de dados modernos (Redis, ElastisSearch, Cassandra) para calcular todo tipo de hashes para vários propósitos. Esse algoritmo específico foi a fonte raiz de muitas melhorias de desempenho na década atual.
Também é usado em implementações de filtros Bloom . Você deve estar ciente de que, se estiver pesquisando "hashes rápidos", provavelmente está enfrentando um problema típico resolvido pelos filtros Bloom. ;-)
Nota : o sopro é um hash de uso geral, que significa NÃO criptográfico. Não impede encontrar o "texto" de origem que gerou um hash. NÃO é apropriado usar senhas de hash.
Mais alguns detalhes: MurmurHash - o que é?
fonte
Em vez de assumir que o MD5 é "bastante lento", tente. Uma implementação simples do MD5 baseada em C em um PC simples (o meu, um Core2 de 2,4 GHz, usando um único núcleo) pode gerar 6 milhões de pequenas mensagens por segundo . Uma pequena mensagem está aqui com até 55 bytes. Para mensagens mais longas, a velocidade de hash MD5 é linear com o tamanho da mensagem, ou seja, processa dados a cerca de 400 megabytes por segundo. Você pode observar que isso é quatro vezes a velocidade máxima de um bom disco rígido ou de uma placa de rede Ethernet de gigabit.
Como meu PC possui quatro núcleos, isso significa que o hash de dados tão rápido quanto meu disco rígido pode fornecer ou receber usos no máximo 6% da capacidade de computação disponível. É necessária uma situação muito especial para que a velocidade do hash se torne um gargalo ou até induza um custo perceptível em um PC.
Em arquiteturas muito menores, nas quais a velocidade do hash pode se tornar um pouco relevante, convém usar o MD4. O MD4 é adequado para fins não criptográficos (e para fins criptográficos, você não deve usar o MD5 de qualquer maneira). Foi relatado que o MD4 é ainda mais rápido que o CRC32 em plataformas baseadas em ARM.
fonte
Embargo
A resposta abaixo não responde à pergunta, pois não recomenda funções de hash. Lembre-se: "Uma função hash é qualquer função que pode ser usada para mapear dados de tamanho arbitrário para valores de tamanho fixo". (Wikipedia) A resposta abaixo recomenda transformações que não garantem resultados de tamanho fixo.
Se você deseja relaxar o requisito de usar uma função hash , continue lendo ...
Resposta original
Sugiro urlencode () ou base64_encode () pelos seguintes motivos:
Adaptando o código de benchmark em outras partes dessas respostas, demonstrei que qualquer um deles é muito mais rápido que qualquer algoritmo de hash. Dependendo do seu aplicativo, você poderá usar o urlencode () ou o base64_encode () para limpar as seqüências de caracteres 'malformadas' que deseja armazenar.
fonte
Etapa 1: Instale o libsodium (ou verifique se você está usando o PHP 7.2+)
Etapa 2: Use um dos seguintes:
sodium_crypto_generichash()
, que é BLAKE2b , uma função de hash mais segura que MD5, mas mais rápida que SHA256. (O link tem referências, etc.)sodium_crypto_shorthash()
, que é SipHash-2-4 , que é apropriado para tabelas de hash, mas não deve ser invocado para resistência à colisão._shorthash
é cerca de 3x mais rápido que_generichash
, mas você precisa de uma chave e tem um risco pequeno, mas realista de colisões. Com_generichash
, você provavelmente não precisa se preocupar com colisões e não precisa usar uma chave (mas pode querer de qualquer maneira).fonte
sodium_crypto_generichash(), which is BLAKE2b, a hash function more secure than MD5 but faster than SHA256. (Link has benchmarks, etc.)
- blake2b com certeza é, mas uma implementação de USERLAND PHP do blake2b será muito mais lenta que o sha256 implementado em C para PHP ... eu gostaria que o PHP pudesse adotar o blake2b na suíte hash_algos () ..Se você procura um serviço rápido e exclusivo, recomendo o xxHash ou algo que use o comando interno crc32c da CPU mais recente, consulte https://stackoverflow.com/a/11422479/32453 . Ele também liga a hashes possivelmente ainda mais rápidos, se você não se importa com a possibilidade de colisão.
fonte
O Adler32 tem melhor desempenho na minha máquina. E
md5()
saiu mais rápido quecrc32()
.fonte
A implementação do md5 dentro do hash é um pouco mais rápida que o md5 (). Portanto, isso pode ser uma opção ou outra coisa, tente:
Você pode ver em http://www.dozent.net/Tipps-Tricks/PHP/hash-performance
fonte
O CRC32 é mais rápido, mas menos seguro que o MD5 e o SHA1. Não há muita diferença de velocidade entre o MD5 e o SHA1.
fonte