La HASHBYTES
funzione richiede solo fino a 8000 byte come input. Poiché i tuoi input sono potenzialmente più grandi di così, i duplicati nell'intervallo del campo che viene sottoposto a hash causeranno collisioni, indipendentemente dall'algoritmo scelto. Valuta attentamente l'intervallo di dati che prevedi di eseguire l'hash: utilizzare i primi 4000 caratteri è la scelta ovvia , ma potrebbe non essere la scelta migliore per i tuoi dati.
In ogni caso, a causa di ciò che è una funzione hash, anche se gli input sono 8000 byte o meno, l' unico modo per garantire la correttezza del 100% nei risultati è confrontare i valori di base ad un certo punto (leggi: non necessariamente prima ). Periodo.
L'azienda stabilirà se è richiesta o meno la precisione al 100%. Questo ti dirà che (a) è necessario confrontare i valori di base , oppure (b) dovresti considerare di non confrontare i valori di base - quanta precisione dovrebbe essere scambiata per le prestazioni.
Sebbene le collisioni di hash siano possibili in un unico set di input, sono infinitamente rare, indipendentemente dall'algoritmo scelto. L'idea generale di utilizzare un valore di hash in questo scenario è restringere in modo efficiente i risultati del join a un set più gestibile, non necessariamente per arrivare immediatamente al set finale di risultati. Ancora una volta, per una precisione del 100%, questo non può essere il passaggio finale del processo. Questo scenario non utilizza l'hashing ai fini della crittografia, quindi un algoritmo come MD5 funzionerà correttamente.
Sarebbe estremamente difficile per me giustificare il passaggio a un algoritmo SHA-x per scopi di "accuratezza" perché se il business impazzirà per le minuscole possibilità di collisione di MD5, è probabile che stiano anche impazzendo che neanche gli algoritmi SHA-x sono perfetti. O devono fare i conti con la leggera inesattezza, o imporre che la query sia accurata al 100% e conforme alle implicazioni tecniche associate. Suppongo che se il CEO dorme meglio la notte sapendo che hai usato SHA-x invece di MD5, bene, va bene; in questo caso non significa ancora molto dal punto di vista tecnico.
A proposito di prestazioni, se le tabelle sono per lo più lette e il risultato del join è necessario frequentemente, prendere in considerazione l'implementazione di una vista indicizzata per eliminare la necessità di calcolare l'intero join ogni volta che viene richiesto. Ovviamente, si risparmia spazio per quello, ma può valerne la pena per il miglioramento delle prestazioni, in particolare se è richiesta una precisione del 100%.
Per ulteriori informazioni sull'indicizzazione di valori di stringhe lunghe, ho pubblicato un articolo che illustra un esempio di come eseguire questa operazione per una singola tabella e presenta aspetti da considerare quando si tenta lo scenario completo in questa domanda.