2016-06-24 1 views
4

Avoir une (éventuellement grande) liste de unique lignes de texte (données JSON stringifiées) J'ai besoin de calculer un hachage unique pour l'ensemble du document texte. Souvent, de nouvelles lignes sont ajoutées au document et, parfois, certaines lignes en sont supprimées, ce qui entraîne la création d'un nouveau hachage pour le document.rapidement (XOR-?) Combiner hachages SHA1 pour générer un nouveau hachage

Le but ultime est d'être capable d'identifier des documents identiques en utilisant simplement le hachage.

Bien sûr, le calcul du hachage SHA1 pour le document entier après chaque modification me donner le hash unique désiré, mais serait également informatiquement cher - en particulier dans une situation où seulement ~ 40 octets sont ajoutés à un 5 mégaoctet et toutes ces données devraient à nouveau passer par le calcul SHA1. Donc, je suis à la recherche d'une solution qui me permet de réduire le temps nécessaire pour calculer le nouveau hachage.

Un résumé des propriétés du problème/exigences:

  • chaque ligne est garantie unique
  • l'ordre des lignes ne pas nécessairement besoin de la matière (encore mieux si elle ne fonctionne pas)
  • la longueur d'une seule ligne est généralement faible, mais tout le document pourrait être grand
  • l'algorithme peut être optimisé pour en annexe données (delet les données pourraient même ing nécessitent un redémarrage à partir de zéro dans ce cas)

Mon idée actuelle est de calculer la SHA1 (ou autre) hachage pour chaque ligne unique individuellement, puis XOR les hash ensemble. Cela devrait satisfaire toutes les exigences. Pour les nouvelles lignes, je calcule juste le SHA1 de cette ligne et XOR avec la somme déjà connue.

Cependant, je suis dans le doute parce que ...

  • Je ne suis pas sûr si le hachage XORé serait encore assez fort pour identifier exactement un document (ie. Est-il une probabilité significativement plus élevé de les collisions non désirées?)
  • calcul beaucoup de hash SHA1 de courtes lignes pourraient être coûteuses de informatiquement son propre (au moins pendant l'initialisation)

Tout le monde peut faire la lumière sur ces questions?

Alternativement, est-il généralement possible avec SHA1 (ou un hachage similaire) de générer rapidement un nouveau hachage pour les données ajoutées (old hash + appended data = new hash)?

+0

Quelle implémentation de 'sha1's utilisez-vous? –

+0

La mise en œuvre ne devrait pas importer pour cette question car elle n'a même pas besoin d'être SHA1 tant que le hachage est assez fort pour identifier "de manière unique" les documents. Cependant, pour répondre à votre question, j'utilise habituellement le [rusha] (https://www.npmjs.com/package/rusha) lib. –

Répondre

0

Vous pouvez effectuer des mises à jour incrémentielles pour vous-stream calcul:

var crypto = require('crypto'); 

var shasum = crypto.createHash('sha1'); 
shasum.update("Hello, "); 
shasum.update("World!"); 
console.log(shasum.digest('hex')); 

shasum = crypto.createHash('sha1'); 
shasum.update("Hello, World!") 
console.log(shasum.digest('hex')); 
+0

Bon à savoir, merci! Peut-être que vous me direz quelque chose sur l'approche XOR décrite ci-dessus, aussi? –

+0

Votre approche 'xor' est quelque chose qui ne va pas. 'a xor b xor b == a'. Je pense aussi que vous n'obtiendrez jamais l'égalité de 'sha1 ('abcd') == foo (sha1 ('abc'), 'd')'. C'est presque impossible. –

+0

note que 'un xor b xor a' ne pourrait jamais se produire puisque toutes les lignes sont uniques –

2

Il y a des problèmes avec hachant chaque fichier individuellement.

Si deux lignes identiques sont ajoutées, les xor combinés ne changeront pas.

Vous feriez mieux de hacher tous les hachages individuels.

Peut-être utiliser un Merkle Tree.

+0

Il ne peut pas arriver que deux lignes identiques soient ajoutées (elles sont uniques, voir question). Merci pour l'indice Merkle Tree, semble intéressant - bien que * généralement * j'ai découvert que hash beaucoup de lignes courtes est très cher, donc probablement un hachage sha1 en streaming (autre réponse) est probablement mieux à la fin –

+1

Sur les ordinateurs que j'ai disponible SHA256 va hachage 400 MB/seconde. – zaph

+0

... et les téléphones mobiles? ;) –