All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.yandex.disk.rest.util.Hash Maven / Gradle / Ivy

/*
* (C) 2015 Yandex LLC (https://yandex.com/)
*
* The source code of Java SDK for Yandex.Disk REST API
* is available to use under terms of Apache License,
* Version 2.0. See the file LICENSE for the details.
*/

package com.yandex.disk.rest.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Hash {

    private enum HashType {

        MD5("MD5"), SHA256("SHA-256");

        private final String value;

        HashType(String value) {
            this.value = value;
        }

        String getValue() {
            return value;
        }
    }

    private final String md5, sha256;
    private final long size;

    public Hash(String md5, String sha256, long size) {
        this.md5 = md5;
        this.sha256 = sha256;
        this.size = size;
    }

    public static Hash getHash(File file)
            throws IOException {
        InputStream is = new FileInputStream(file);
        try {
            return getHash(is, file.length());
        } finally {
            close(is);
        }
    }

    private static Hash getHash(InputStream is, long size)
            throws IOException {
        MessageDigest md5Digest, sha256Digest;
        try {
            md5Digest = MessageDigest.getInstance(HashType.MD5.getValue());
            sha256Digest = MessageDigest.getInstance(HashType.SHA256.getValue());
        } catch (NoSuchAlgorithmException ex) {
            throw new RuntimeException(ex);
        }
        byte[] buf = new byte[8192];
        int count;
        while ((count = is.read(buf)) > 0) {
            md5Digest.update(buf, 0, count);
            sha256Digest.update(buf, 0, count);
        }
        return new Hash(toString(md5Digest.digest()), toString(sha256Digest.digest()), size);
    }

    private static void close(InputStream is)
            throws IOException {
        if (is != null) {
            is.close();
        }
    }

    public String getMd5() {
        return md5;
    }

    public String getSha256() {
        return sha256;
    }

    public long getSize() {
        return size;
    }

    public static String toString(byte[] bytes) {
        if (bytes == null) {
            return null;
        }
        StringBuilder out = new StringBuilder();
        for (byte b : bytes) {
            String n = Integer.toHexString(b & 0x000000FF);
            if (n.length() == 1) {
                out.append('0');
            }
            out.append(n);
        }
        return out.toString();
    }

    @Override
    public String toString() {
        return "Hash{" +
                "md5='" + md5 + '\'' +
                ", sha256='" + sha256 + '\'' +
                ", size=" + size +
                '}';
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy