J'essaie de garder une trace d'un ensemble de fichiers, qui peut avoir le même nom et les métadonnées. J'aimerais utiliser un hachage pour différencier et l'utiliser comme une pièce d'identité unique, mais je ne suis pas sûr de savoir lequel utiliser? Les fichiers sont relativement petits (dans la plage de 100 kb) et j'aimerais pouvoir le hacher en moins de 10 secondes. Quel hachain (qui vient intégré dans Java 1.5) sera la meilleure suite mes besoins? P>
4 Réponses :
Utiliser un contenu basé sur le contenu SHA1 est ce que j'utilise. MD5 est plus faible et plus rapide mais la vitesse des processeurs modernes n'est pas une préoccupation. P>
Notez qu'un hachage de ce type sera jamais em> être unique, avec l'utilisation d'une efficacité d'une très bonne chance de ne jamais avoir une collision. Si vous n'êtes pas concerné avec la sécurité (c'est-à-dire que quelqu'un tente délibérément de casser votre hachage), il vous suffit de simplement utiliser le hachage de MD5 vous donnera un excellent hachage avec un effort minimal. P> Il est probable que vous puissiez faire un hachage de 100 ko bien moins élevé. plus de 10 secondes et, bien que SHA-1 soit toujours théoriquement imparfait, il est d'une résistance plus élevée que MD5. P> MessageDIGEST vous procurera une implémentation de. P> Voici quelques Exemples de l'utilisation avec des flux . P> Je dois aussi noter que thi s Excellente réponse de Jarnbjo indiquerait que même le hachage SHA fourni dans Java est bien capable de dépasser 20 Mo / s, même sur du matériel X86 relativement modeste. Cela impliquerait Si vous avez besoin de pour un code d'échantillon raisonnablement efficace, je suggère Ce comment
Les points saillants peuvent être distillées dans les éléments suivants (syntonisez la taille de la mémoire tampon comme vous le trouvez): p>
Vous pouvez utiliser MessageDigest avec SHA1 STRY>: MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
InputStream is = new FileInputStream(aFile);
int res;
while ((res = inputStream.read()) != -1) {
digester.update((byte) res);
}
byte[] digest = messageDigest.digest();
Aucun indice, mais c'est une réponse raisonnable alors voici un +1 à compenser
Voici la façon dont je le fais,
Je pense que cela devrait fonctionner rapidement, vérifier s'il est terminé en 10 secondes
J'ajouterais la réserve à cela que forçant l'ensemble du fichier à lire dans la mémoire via une chaîne est susceptible d'être inefficace, nécessite plus de mémoire que nécessaire et avoir des implications si vous souhaitez avoir des octets crus ASCII plutôt que de le forcer à être devenu des caractères larges d'abord (par exemple si vous vouliez que un outil standard externe puisse également être haché)