HashCode vs SHA-1
J'aimerais comparer certains grands objets représentant des arbres et cache quelque chose pour éviter les comparant à chaque fois que le nouvel objet avec un déjà existant...
La question est de savoir quelle serait la meilleure chose ? (un compromis entre la performance et les collisions...).
D'une part, j'ai régulièrement un hashCode la fonction basée sur la valeur des différents champs (à la suite du chapitre 3 de efficace Java. Mais je ne suis pas en mesure d'évaluer le potentiel de collisions impliquées par une telle approche.
Sur l'autre main, j'ai l'MessageDigest approche de la java standard de la distribution de l'algorithme SHA-1. Je présume que ça ne va pas être efficace, mais j'ai peut-être moins de collision. Suis-je le droit ? Est-ce une bonne solution dans mon contexte ou suis-je complètement tort ?
Le truc c'est que je ne sais pas quelle serait la taille des objets. Veuillez également noter que la valeur calculée n'est pas destiné à être utilisé dans une table de hachage.
thx...
OriginalL'auteur LB40 | 2009-05-12
Vous devez vous connecter pour publier un commentaire.
Voir la suivante:
Garder à l'esprit les points suivants:
Généralement, vous pouvez déterminer la probabilité d'une collision en fonction du nombre de prévu objets et le nombre possible de hachages (max valeur de hachage). Voir http://en.wikipedia.org/wiki/Birthday_paradox pour l'explication détaillée.
Personnellement? Des objets Java (classes instanciées) < de 10 000? Code de hachage. Représentant fichiers /gouttes /beaucoup de données? SHA-1. J'utilise de hachage SHA-1 dans ma base de données pour empêcher les gens de faire ETL travailler sur le même fichier plusieurs fois. J'utilise ensuite de hachage SHA-1 de nouveau, à un deuxième niveau d'empêcher les gens de ETLing le même article en plusieurs fois (par exemple, des fichiers différents, mais le même ordre apparaît deux fois).
OriginalL'auteur Jeff Ferland
Personnellement, je utiliser
hashCode()
pour les objets jusqu'à ce qu'il a été prouvé que les collisions sont un réel problème pour éviter préventivement l'optimisation d'un problème dont vous ne pouvez pas la réalité.voir l'Autocratie du lien ci-dessous, cependant je ne sais pas vraiment la plage des entiers que Bloch du hashcode() de la mise en œuvre sera de retour
OriginalL'auteur matt b
En raison de la problème d'anniversaire, la chance de collision dépend de combien d'articles que vous travaillez avec.
De 160 bits de l'espace de l'algorithme SHA-1 est tellement grand que je doute que vous pourriez jamais avoir assez d'éléments pour voir une collision.
L'espace de 32 bits de
hashCode()
ne devrait pas avoir un nombre important de collisions jusqu'à ce que vous avez plus de 50 000 articles. Cependant, cela dépend de l'aide d'un bon algorithme de hachage.Afin d'appliquer un chiffrement digest comme SHA-1, vous aurez besoin de convertir votre graphique pour une chaîne d'octets, ce qui est susceptible d'être gourmand en ressources, et pourrait être compliqué.
OriginalL'auteur erickson
Généralement de fichiers en double/détection de données, MD5 est un bon compromis entre la vitesse et les risques de collision. MD5 est inapproprié si quelqu'un pourrait-être délibérément artisanat fichiers de tromper votre programme (il est peu vulnérable aux attaques par collision). Mais si vous êtes inquiet au sujet de collisions par hasard, puis ses 128 bits largeur est pratiquement toujours suffisante à l'heure actuelle.
SHA-1 et SHA-256 de vous donner une certaine protection contre délibérée attaques par collision (théorique mais pratique, aucun des attaques avec l'algorithme SHA-1 sont connus; pour la saisie de données, il est rarement la peine d'aller beyon 160 bits de code de hachage de la largeur). SHA-1 est à peu près la moitié de la vitesse de l'algorithme MD5.
Certainement si vous utilisez MD5, la performance ne devrait probablement pas être trop un problème. Mais évidemment, cela dépendra de la taille de vos données. Vous pouvez être intéressé par quelques informations j'ai mis en place sur performances de sécuriser les fonctions de hachage en Java.
Si vous avez vraiment besoin de quelque chose de plus rapide et vous êtes à seulement quelques millions d'éléments de données, puis une autre option à considérer est la version 64 bits de l'algorithme de hachage proposé par le Numérique Recettes auteurs.
Java standard hashCode() de la mise en œuvre (de, disons, String) est probablement pas adapté: au-delà de toutes les questions relatives à la qualité de la table de hachage, ses 32 bits largeur signifie que vous devez attendre une collision après seulement 16.000 objets.
OriginalL'auteur Neil Coffey
Je vais approuver matt b l'expression "ne pas optimiser avant de vous avez besoin pour optimiser."
Cependant, si vous décidez que vous avez besoin quelque chose de plus que le code de hachage en bas de la route... j'ai utilisé des résumés de message MD5 (dans mon cas) pour "unique" d'identifier les différents éléments téléchargés à partir de flux RSS, donc je n'ai pas fini avec le même élément apparaissant plusieurs fois dans la liste comme je l'ai interrogé à plusieurs reprises. Ceux-ci étaient généralement de petites offres de sorte que le digérer pourrait être calculée rapidement. Dans mon expérience, il a été très efficace et bien travaillé.
Car ils sont normalement un moyen de fonctions destinées à réagir vivement, même à de très petits changements dans les données d'entrée, vous êtes certainement moins de chances d'obtenir des collisions avec MD5 ou SHA-1.
OriginalL'auteur John Munsch