2017-03-23 1 views
1

Une application particulière (ASP.Net/C# & SQL Server Express 2014) possède les exigences suivantes. Sur une certaine action de l'interface utilisateur, les éléments suivants:Comparaison d'un grand nombre de texte de grande chaîne dans SQL Server - Performance est meilleure si hachage est comparé à la place des chaînes

  1. Plus de 120 blocs de texte d'environ 10 000 caractères (unicode) doivent être comparés à un autre ensemble correspondant de plus de 120 blocs.
  2. Ce bloc de texte contient du HTML et le contenu réel du texte est susceptible d'être dans n'importe quelle langue.

La solution que j'ai en tête est d'utiliser HASHBYTES et de hacher toutes les valeurs et conserver. Quand il est temps de comparer, je comparerais la valeur de hachage au lieu du grand bloc de texte. Je vais hacher les valeurs une fois et les garder (et ressasser quand la valeur de la source change) et les utiliser plusieurs fois pour la comparaison.

Voici mes questions:

  1. est mon solution optimale d'un point de performance?
  2. Le HASHBYTE (disons SHA1) est-il sujet à une collision de hachage? Devrais-je vérifier la valeur de la chaîne lorsque je reçois un hachage?
+1

Compte tenu de la taille de vos chaînes, 'HASHBYTES' pourrait ne pas être une solution viable, car il [sur SQL 2014 et plus tôt, il prend en charge que les entrées de jusqu'à 8000 octets] (https://msdn.microsoft.com/fr-fr/library/ms174415.aspx) –

Répondre

2

Il sera certainement plus rapide de comparer des hachages que de comparer des chaînes. Même si le coût du processeur pour comparer les grandes chaînes est ignoré, étant donné que nvarchar (max) et 10.000 caractères, ils seront dans le grand magasin d'objets (stockage LOB) plutôt que sur la ligne et nécessiteront des E/S de disque supplémentaires. Comme il a été souligné, HASHBYTES a une limite de 8 000 octets. Pour surmonter ce problème, vous devrez diviser les données en morceaux de moins de 4 000 caractères (puisqu'ils sont de 2 octets chacun) et les hacher en morceaux. Les hachages intermédiaires peuvent ensuite être concaténés et le résultat haché.

Il y a une très faible probabilité d'une collision de hachage SHA1. Si c'est un problème, il est recommandé d'utiliser SHA_256. Le résultat sera 32 octets au lieu de 20 pour SHA1.

LOB Stockage: http://www.sqlskills.com/blogs/kimberly/understanding-lob-data-20082008r2-2012/

collisions Hash: https://crypto.stackexchange.com/questions/24732/probability-of-sha256-collisions-for-certain-amount-of-hashed-values