AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 786338
Accepted
poige
poige
Asked: 2016-06-27 02:59:43 +0800 CST2016-06-27 02:59:43 +0800 CST 2016-06-27 02:59:43 +0800 CST

Como verificar a identidade de arquivos enormes se o hash estiver vinculado à CPU?

  • 772

Para arquivos pequenos, o hashing é bom, mas com os grandes, você pode encontrar facilmente md5sumo limite da CPU. Existe algum algoritmo de hash capaz de escalar em vários núcleos? Alguma solução alternativa? Ideias? Nada? :)

hash multi-core big-data
  • 7 7 respostas
  • 8429 Views

7 respostas

  • Voted
  1. Best Answer
    poige
    2016-06-27T06:49:52+08:002016-06-27T06:49:52+08:00

    A minha melhor solução no momento é:

    parallel --block=512M --pipepart -a …HUGEFILE… --progress --recend '' \ -k -j …NUMofProcessesSay4… md5sum | md5sum

    — Note-se que:

    1. O hash md5 resultante não é do arquivo, mas sim de md5s de suas partes, mas ainda permite comparar se a réplica é idêntica à origem
    2. Ele também não funciona muito bem, especialmente quando você usa pipee não arquiva como entrada
    3. parallel's --pipepartcomo eu descobri não suporta partições de disco

    Então, eu adoraria ouvir outras maneiras de contornar também.

    • 14
  2. shodanshok
    2016-06-30T04:02:27+08:002016-06-30T04:02:27+08:00

    Infelizmente, MD5 é um processo linear onde seu estado depende de todas as entradas anteriores. Em outras palavras, você não pode realmente paralelizá-lo. Além disso, não tenho conhecimento de nenhum hash alg real que não opere dessa maneira.

    O que você pode fazer (e, com base em sua resposta, você está fazendo) é dividir os arquivos de origem e calcular simultaneamente o md5sum de cada pedaço.

    Se você não pode/não quer fazer isso, você deve usar uma função de hash mais rápida como xxHash , CityHash ou SpookyHash

    Outra ideia (talvez seja aplicável ao seu uso pretendido): se você precisar de algo mais rápido que o MD5 (embora single-threaded), você pode usar o CRC32 (que é acelerado por hardware por CPUs recentes) para um primeiro passe rápido, recorrendo ao MD5 /SHA1 para uma segunda passagem em arquivos aparentemente idênticos.

    • 5
  3. Gary
    2016-06-27T05:22:20+08:002016-06-27T05:22:20+08:00

    Não há como contornar o processamento de todo o arquivo. MD4 ou CRC32 são provavelmente suas melhores apostas para um algoritmo rápido e amplamente implantado (embora o CRC32 seja muito menos eficaz que o MD4).

    Testar várias implementações de seu algoritmo de escolha ajudará. Se você puder encontrar uma implementação de asm bem testada, provavelmente melhorará o desempenho de seus primos C/C++.

    Se você realmente não se importa com a interoperabilidade, o hash em vários núcleos é facilmente possível dividindo o arquivo em partes (não precisa ser feito no disco, você apenas começa a ler a partir de deslocamentos específicos) e processa cada parte separadamente (no entanto, isso resultará em graves problemas de disco, degradando o desempenho, especialmente para discos mecânicos). Você terminará com hashes separados para cada pedaço (embora isso tenha outras vantagens, como apontar para o pedaço quebrado), mas você sempre pode misturá-los para um valor final.

    Este Gist pode ser um bom começo para algo em Python.

    • 2
  4. tfrederick74656
    2016-07-04T11:22:34+08:002016-07-04T11:22:34+08:00

    A maioria das respostas aqui abordou a natureza linear da maioria dos algoritmos de hash. Embora eu tenha certeza de que existem alguns verdadeiros algoritmos de hash escaláveis, uma solução mais fácil é simplesmente dividir os dados em pedaços menores e fazer o hash de cada um individualmente.

    Considere a abordagem do BitTorrent: quando um Torrent é criado, todos os arquivos são divididos em 'blocos', cada bloco com hash individualmente e cada um desses hashes gravados no arquivo .torrent. Isso é o que permite que um par verifique gradualmente os dados de entrada, sem ter que esperar que o download do arquivo inteiro termine primeiro. Os erros também podem ser corrigidos por bloco, em vez de exigir a retransmissão de todo o arquivo. Além dos benefícios logísticos, essa abordagem também permite que o hash seja dimensionado em vários núcleos - se 8 núcleos estiverem disponíveis, 8 blocos podem ser hash simultaneamente.

    Se você projetar seu processo de verificação para trabalhar em algum subconjunto dos dados, por exemplo, blocos de tamanho fixo, você pode fazer o hash de cada bloco em um núcleo separado, eliminando assim uma grande quantidade de atraso no pipeline. Obviamente, essa abordagem tem uma pequena compensação de tempo/memória: cada instância adicional de hash tem alguma sobrecarga associada a ela, principalmente na forma de memória, embora isso seja mínimo, a menos que você esteja executando centenas de instâncias.

    • 0
  5. Jack O'Connor
    2018-10-02T09:14:04+08:002018-10-02T09:14:04+08:00

    Estou trabalhando em um projeto de hash de árvore, projetado exatamente para esse problema: hashing paralelo pronto para uso de arquivos grandes. Funciona agora, embora não tenha sido revisado, e há uma boa chance de que as alterações da revisão resultem em alterações no resumo final. Dito isto, é muito rápido: https://github.com/oconnor663/bao

    • 0
  6. Jason
    2016-07-04T10:47:18+08:002016-07-04T10:47:18+08:00

    Você pode usar md5deep para isso e hashdeep para outros hashes. Ele suporta multi threading com o -jsinalizador. Por padrão, ele criará um thread de hash para cada núcleo. Ele também possui um sinalizador para quebrar os arquivos em pedaços antes do hash, mas não usará vários encadeamentos em um único arquivo. Eu usei isso para obter sha256 de meio milhão de arquivos e funcionou muito bem. Ele também possui um flash recursivo que facilita o manuseio de grandes árvores de diretórios.

    Aqui está a página de manual para ele http://md5deep.sourceforge.net/md5deep.html e git repo https://github.com/jessek/hashdeep

    O nome do pacote no ubuntu e debian é md5deep e inclui hashdeep.

    • -1
  7. mc0e
    2016-07-04T23:01:55+08:002016-07-04T23:01:55+08:00

    É fácil projetar um algoritmo de hash que seja escalável em vários núcleos, apenas os algoritmos de hash mais conhecidos tendem a ser projetados especificamente para evitar isso, para que tarefas como encontrar colisões de hash sejam feitas o mais lento possível.

    As funções de hash que não forçam o processamento serial podem ser adequadas para você, mas isso depende das propriedades que você espera de sua função de hash. Como tal, não acho que você tenha fornecido informações suficientes para que uma boa recomendação seja feita.

    Como outros sugeriram, você pode construir uma função hash como o hash dos hashes concatenados de cada um dos blocos de um determinado tamanho no original. Contanto que o tamanho do bloco seja grande o suficiente para dificultar a reversão dos hashes de blocos individuais, é provável que funcione bem o suficiente para a maioria dos propósitos. Quão grande deve ser depende de quão previsível é o conteúdo desses blocos. Se você puder estimar a entropia e escolher um tamanho de bloco de modo a obter mais de 128 bits de entropia por bloco, isso deve ser suficiente para a maioria dos propósitos (e um exagero para muitos em que a segurança não é a principal preocupação).

    Do ponto de vista da segurança, você está preocupado com o grau de entropia no nível do bloco, porque, caso contrário, encontrar uma colisão para um único bloco é suficiente para permitir que um ator malicioso substitua parte do conteúdo e obtenha o mesmo hash final.

    Talvez valha a pena notar que ter um tamanho de bloco fixo significa que a principal fraqueza dos MD5s é irrelevante - o hacker não pode anexar dados extras ao bloco.

    Se suas necessidades são evitar colisões de hash que ocorrem naturalmente em vez de colisões maliciosas, você pode, sem dúvida, usar uma função de soma de verificação muito mais rápida. Hashes criptograficamente seguros são normalmente projetados para serem lentos para calcular.

    Uma função do grupo de funções skein usando o modo hash tree opcional pode ser adequada para você. Então, novamente, CRC32 pode ser tudo o que você precisa.

    • -1

relate perguntas

  • Como saber quais arquivos especificar exclusões para os instaladores de aplicativos na lista de permissões usando hashes com um GPO do Windows?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve