
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.security.MessageDigest;


/**
 * Created by terry on 6/26/18.
 */

public class HashFunctions {

    public static void main(String[] args) {

        //get the current time since epoch
        String current_time = String.valueOf(System.currentTimeMillis());

        //form the set1
        String[] list_data1 = {"0000000036dc2ce23cdd934eff4bae120155de8b8712de8489c8870b06e334ff",
                "c0ba5ba1c5ba02fb02c4ea93ec16cae7ea1994b5b3f9ef0e293b841081eb3003", current_time, Double.toString(1.0000), Double.toString(124867778)};
        System.out.println(Arrays.toString(list_data1));

        //produce string
        String str1 = String.join("", list_data1);
        System.out.println("str1: " + str1);
        System.out.println();


        //convert string to hex
        String hex1 = asciiToHex(str1);
        System.out.println("hex1: " + hex1);
        System.out.println();

        //form the set2
        String [] list_data2 = {"00000000d84724559f1691d916b2ed63a44884d495d155197647ce7667116b16",
                "69a14e6b050d10d6621faee3dac6682809feb0ffa76320b33c5c09f1059f06c7", current_time, Double.toString(1.0000), Double.toString(124867778)};
        System.out.println(Arrays.toString(list_data2));

        //produce string
        String str2 = String.join("", list_data2);
        System.out.println("str2: " + str2);
        System.out.println();


        //convert string to hex
        String hex2 = asciiToHex(str2);
        System.out.println("hex2: " + hex2);
        System.out.println();


        try {
            String shaLeft =  doubleSHA(str1);
            System.out.println("sha_left is: " + shaLeft);
            System.out.println();
            String shaRight =  doubleSHA(str2);
            System.out.println("sha_right is: " + shaRight);
            System.out.println();
            String rootString = shaLeft + shaRight;
            String root = singleSHA(rootString);
            System.out.println("root is: " + root);

        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }


    private static String asciiToHex(String asciiStr) {
        char[] chars = asciiStr.toCharArray();
        StringBuilder hex = new StringBuilder();
        for (char ch : chars) {
            hex.append(Integer.toHexString((int) ch));
        }
        return hex.toString();
    }


    private static String singleSHA (String inputString) throws NoSuchAlgorithmException {

        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(inputString.getBytes());

        byte byteData[] = md.digest();

        //convert the byte to hex format
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < byteData.length; i++) {
            sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
        }

        //System.out.println("Hex format : " + sb.toString());
        return sb.toString();
    }

    private static String doubleSHA (String inputString) throws NoSuchAlgorithmException {

        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(inputString.getBytes());

        byte [] hash1 = md.digest();

        md.reset();
        byte[] hash2 = md.digest(hash1);

        //convert the byte to hex format
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < hash2.length; i++) {
            sb.append(Integer.toString((hash2[i] & 0xff) + 0x100, 16).substring(1));
        }

        //System.out.println("Hex format : " + sb.toString());
        return sb.toString();

    }
}

