查找使用 SHA256 算法后连接到字符串的值 V 在基于输入的最终散列中具有 x 个零

问题描述

private static String datosTransaccion;
private static int numeroCeros;
private static String cadenaV;
private static int numIntentos;

public SHA256(String datosTransaccion,int numeroCeros) {
    this.datosTransaccion = datosTransaccion;
    this.numeroCeros = numeroCeros;
}

public String algoritmo() {
    System.out.println("Empezando el algoritmo de encriptacion");
    MessageDigest digest;
    String encriptado = "Error";
    try {
        digest = MessageDigest.getInstance("SHA-256");
        Boolean centinela = false;

        while (centinela == false) {
            numIntentos += 1;
            System.out.println("intento numero:" + numIntentos);
            cadenaV = generadorCadenaV();
            System.out.println(cadenaV);
            String cadena = datosTransaccion + cadenaV;
            System.out.println(cadena);
            final byte[] hashbytes = digest.digest(cadena.getBytes(StandardCharsets.UTF_8));
            int cuenta = 0;
            int numCeros = numeroCeros / 4;
            encriptado = bytesToHex(hashbytes);
            System.out.println(encriptado);
            for (int i = 0; i < numCeros - 1; i++) {
                if (encriptado.substring(i,i + 1).equals("0")) {
                    cuenta += 1;
                    System.out.println(cuenta);
                }
            }
            System.out.println(numeroCeros);
            if (cuenta * 4 == numeroCeros) {
                centinela = true;
            }
        }

        return encriptado;

    } catch (NoSuchAlgorithmException e) {
        e.printstacktrace();
    }

    return encriptado;
}

private static String bytesToHex(byte[] hash) {
    StringBuilder hexString = new StringBuilder(2 * hash.length);
    for (int i = 0; i < hash.length; i++) {
        String hex = Integer.toHexString(0xff & hash[i]);
        if (hex.length() == 1) {
            hexString.append('0');
        }
        hexString.append(hex);
    }
    return hexString.toString();
}

public String generadorCadenaV() {
    int leftLimit = 97; // letra 'a'
    int rightLimit = 122; // letra 'z'
    Random rand = new Random();
    int targetStringLength = rand.nextInt(7) + 1; // longitud entre 1-7
    Random random = new Random();

    String cadenaV = random.ints(leftLimit,rightLimit + 1).limit(targetStringLength)
            .collect(StringBuilder::new,StringBuilder::appendCodePoint,StringBuilder::append).toString();

    return cadenaV;
}

public String darCadenaV() {
    return cadenaV;
}

public int darIntentos() {
    return numIntentos;
}

这里的主要问题是我需要使用值 a-z 生成大小为 1-7 的 V 字符串,以便在我想要的字符串开头获得 0 的数量。我的程序应该返回它,但它太长而且永远不会结束。我需要一个线性解决方案。一个成功输出的例子是:

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)