web-dev-qa-db-fra.com

Java: Comment créer SHA-1 pour un fichier?

Quel est le meilleur moyen de créer un SHA-1 pour un très gros fichier en Java6 pur? Comment implémenter cette méthode:

public abstract String createSha1(Java.io.File file);
27
Witek

Utilisez la classe MessageDigest et fournissez des données pièce par pièce. L'exemple ci-dessous ignore des détails tels que la conversion d'octet [] en chaîne et la fermeture du fichier, mais devrait vous en donner une idée générale.

public byte[] createSha1(File file) throws Exception  {
    MessageDigest digest = MessageDigest.getInstance("SHA-1");
    InputStream fis = new FileInputStream(file);
    int n = 0;
    byte[] buffer = new byte[8192];
    while (n != -1) {
        n = fis.read(buffer);
        if (n > 0) {
            digest.update(buffer, 0, n);
        }
    }
    return digest.digest();
}
35
Jeff Foster

Op a demandé à la fonction de renvoyer une chaîne de la chaîne SHA1. J'ai donc pris la réponse @jeffs et ajouté la conversion manquante à la chaîne:

/**
 * Read the file and calculate the SHA-1 checksum
 * 
 * @param file
 *            the file to read
 * @return the hex representation of the SHA-1 using uppercase chars
 * @throws FileNotFoundException
 *             if the file does not exist, is a directory rather than a
 *             regular file, or for some other reason cannot be opened for
 *             reading
 * @throws IOException
 *             if an I/O error occurs
 * @throws NoSuchAlgorithmException
 *             should never happen
 */
private static String calcSHA1(File file) throws FileNotFoundException,
        IOException, NoSuchAlgorithmException {

    MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
    try (InputStream input = new FileInputStream(file)) {

        byte[] buffer = new byte[8192];
        int len = input.read(buffer);

        while (len != -1) {
            sha1.update(buffer, 0, len);
            len = input.read(buffer);
        }

        return new HexBinaryAdapter().marshal(sha1.digest());
    }
}
18
user2084795
public static String computeFileSHA1( File file ) throws IOException
{
    String sha1 = null;
    MessageDigest digest;
    try
    {
        digest = MessageDigest.getInstance( "SHA-1" );
    }
    catch ( NoSuchAlgorithmException e1 )
    {
        throw new IOException( "Impossible to get SHA-1 digester", e1 );
    }
    try (InputStream input = new FileInputStream( file );
         DigestInputStream digestStream = new DigestInputStream( input, digest ) )
    {
        while(digestStream.read() != -1){
            // read file stream without buffer
        }
        MessageDigest msgDigest = digestStream.getMessageDigest();
        sha1 = new HexBinaryAdapter().marshal( msgDigest.digest() );
    }
    return sha1;
}
0
bighux