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 / dba / Perguntas / 35219
Accepted
Sky
Sky
Asked: 2013-02-22 21:44:02 +0800 CST2013-02-22 21:44:02 +0800 CST 2013-02-22 21:44:02 +0800 CST

Escolhendo o algoritmo certo na função HashBytes

  • 772

Precisamos criar o valor de hash dos dados nvarchar para fins de comparação. Existem vários algoritmos de hash disponíveis no T-SQL, mas qual é o melhor para escolher neste cenário?

Queremos garantir que o risco de ter um valor de hash duplicado para dois valores nvarchar diferentes seja o mínimo. Com base em minha pesquisa na internet, o MD5 parece o melhor. Isso está certo? O MSDN nos informa (link abaixo) sobre os algoritmos disponíveis, mas nenhuma descrição sobre qual deles para quais condições?

HASHBYTES (Transact-SQL)

Precisamos unir duas tabelas em duas colunas nvarchar(max). Como você pode imaginar, a consulta leva muito tempo para ser executada. Achamos que seria melhor manter o valor de hash de cada dado nvarchar(max) e fazer a junção nos valores de hash em vez dos valores nvarchar(max) que são blobs. A questão é qual algoritmo de hash fornece a exclusividade, para que não corramos o risco de ter um valor de hash para mais de um nvarchar(max).

sql-server sql-server-2008-r2
  • 4 4 respostas
  • 19380 Views

4 respostas

  • Voted
  1. Best Answer
    Jon Seigel
    2013-02-25T21:52:45+08:002013-02-25T21:52:45+08:00

    A HASHBYTESfunção leva apenas até 8000 bytes como entrada. Como suas entradas são potencialmente maiores do que isso, duplicatas no intervalo do campo que recebe hash causarão colisões, independentemente do algoritmo escolhido. Considere cuidadosamente o intervalo de dados que você planeja fazer hash - usar os primeiros 4.000 caracteres é a escolha óbvia , mas pode não ser a melhor escolha para seus dados.

    De qualquer forma, por causa do que é uma função hash, mesmo que as entradas tenham 8.000 bytes ou menos, a única maneira de garantir 100% de exatidão nos resultados é comparar os valores básicos em algum ponto (leia-se: não necessariamente primeiro ). Período.

    A empresa ditará se 100% de precisão é necessária ou não. Isso lhe dirá que (a) é necessário comparar os valores básicos ou (b) você deve considerar não comparar os valores básicos -- quanta precisão deve ser trocada pelo desempenho.

    Embora as colisões de hash sejam possíveis em um único conjunto de entrada, elas são infinitamente raras, independentemente do algoritmo escolhido. A ideia de usar um valor de hash neste cenário é restringir com eficiência os resultados da junção a um conjunto mais gerenciável, não necessariamente chegar ao conjunto final de resultados imediatamente. Novamente, para 100% de precisão, esta não pode ser a etapa final do processo. Este cenário não está usando hash para fins de criptografia, portanto, um algoritmo como o MD5 funcionará bem.

    Seria extremamente difícil para mim justificar a mudança para um algoritmo SHA-x para fins de "precisão", porque se a empresa vai surtar com as minúsculas possibilidades de colisão do MD5, é provável que eles também surtem com isso os algoritmos SHA-x também não são perfeitos. Eles precisam aceitar a pequena imprecisão ou exigir que a consulta seja 100% precisa e viva com as implicações técnicas associadas. Suponho que se o CEO dormir melhor à noite sabendo que você usou SHA-x em vez de MD5, tudo bem; ainda não significa muito do ponto de vista técnico neste caso.

    Por falar em desempenho, se as tabelas forem principalmente lidas e o resultado da junção for necessário com frequência, considere a implementação de uma exibição indexada para eliminar a necessidade de calcular toda a junção toda vez que ela for solicitada. É claro que você troca o armazenamento por isso, mas pode valer a pena para melhorar o desempenho, especialmente se 100% de precisão for necessária.

    Para ler mais sobre a indexação de valores de string longa, publiquei um artigo que mostra um exemplo de como fazer isso para uma única tabela e apresenta coisas a serem consideradas ao tentar o cenário completo nesta questão.

    • 20
  2. ConcernedOfTunbridgeWells
    2013-02-24T12:09:12+08:002013-02-24T12:09:12+08:00

    MD5 deve estar bem e a saída pode ser armazenada em um binário (16). A probabilidade de uma colisão (ver paradoxo do aniversário ) ainda é muito baixa, mesmo com um grande tamanho de amostra física. A saída de SHA-1 leva 20 bytes e a saída de SHA-256 leva 32 bytes. A menos que você tenha um número tão grande de registros que sua probabilidade de colisão de aniversário se torne significativa (fisicamente impossível ou pelo menos impraticável com as tecnologias de hardware atuais), provavelmente estará tudo bem.

    • 8
  3. World Wide DBA
    2013-02-23T03:55:21+08:002013-02-23T03:55:21+08:00

    Eu iria com SHA-1, é o melhor dos algoritmos disponíveis e tem a menor expectativa de colisão de todos eles (2 ^ 51 em comparação com MD5, que é 2 ^ 20,96). O MD5 também provou ser vulnerável a colisões em determinados cenários.

    Fontes:

    http://en.wikipedia.org/wiki/SHA-1 http://en.wikipedia.org/wiki/Comparison_of_cryptographic_hash_functions#Cryptanalysis http://en.wikipedia.org/wiki/MD5

    • 4
  4. Gabe
    2019-04-09T12:59:44+08:002019-04-09T12:59:44+08:00

    Eu não vi isso mencionado nas respostas, mas por MSDN :

    A partir do SQL Server 2016 (13.x), todos os algoritmos diferentes de SHA2_256 e SHA2_512 foram preteridos. Algoritmos mais antigos (não recomendados) continuarão funcionando, mas gerarão um evento de descontinuação.

    Eu fiz uma pergunta semelhante, então cabe a você decidir se deseja usar uma função obsoleta, como MD5 (se estiver no 2016+). Você pode fazer testes para ver quanta diferença existe em armazenamento e desempenho entre MD5 e SHA2.

    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

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

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

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