solidez ... ¿qué algoritmo hash usar?

He intentado usar muchos algoritmos hash, pero la salida en solidez no coincide con la que se proporciona en los convertidores en línea.

Here is my program:-
pragma solidity ^0.4.18;  
contract C {  
bytes32 public temp;  
function hashingsha3 (uint s)   {  
temp= sha3(s);  
}

    function hashingsha256 (uint s) {
        temp= sha256(s); 
    }
     function kec (uint s)   returns  (bytes32 hash){
        temp= keccak256(s); 
    }

}

este es el sitio en línea para convertir

He leído que solidity no usa el keccak256 actual aprobado por NIST.
Pero entonces, ¿qué usa que coincida con cualquier salida en línea?
Cualquier ayuda sería útil.

Lista de salidas:
Solidity
sha3(12)
0xdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7

sha256(12)
0xa82872b96246dac512ddf0515f5da862a92ecebebcb92537b6e3e73199694c45

keccak256(12) 0xdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7

convertidor en línea
SHA256(12) 6b51d431df5d7f141cbececcf79edf3dd861c3b4069f0b11661a3eefacbba918

SHA512/256 (12) d0d0b58b8cad7a27781cb78b3212d8abce1a4eb4192882e703f7f2e1ea5158da

SHA3-256(12) 1a9a118cb653759c3fcb3bd5060e6f9910c8c27008dd11fe4315f4635c9caa98

SHA3-512 (12) f235c129089233ce3c9c85f1d1554b9cb21952b27e0765bcbcf75d550dd4d2874e546889da5c44db9c066e05e268f4742d672889ff62fb9cb18a3d06b58

Keccak-256 (12) 7f8b6b088b6d74c2852fc86c796dca07b44eed6fb3daf5e6b59f7c364db14528

Gracias

EDITADO:

pragma solidity ^0.4.18;  
contract C {  
bytes32 public temp;  
function hashingsha3 (bytes s)   {  
temp= sha3(s);  
}  
function hashingsha256 (bytes s) {  
temp= sha256(s);  
}  
function kec (bytes s)  {  
temp= keccak256(s);  
}  
}

Cambié el código: pero aún las salidas ahora para esto son: Pasadas como una cadena en solidez: sha256 (12) 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

sha3(12) 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470

keccak256(12) 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

No está claro lo que estás preguntando.
Estoy preguntando por qué las salidas hash de solidity y el convertidor en línea son diferentes. ¿Qué debo usar si deseo confirmarlo con los convertidores en línea?

Respuestas (2)

Completamente de acuerdo con el Sr. Marx. Solo estoy agregando otra respuesta como comentario para su consideración.

Su pregunta llama la atención sobre una suposición oculta. Es decir, que actualmente es posible y conveniente encontrar una biblioteca adecuada para cualquier cliente, y siempre lo será .

En mi opinión , sería una buena idea exponer la función de solo lectura para ayudar a los clientes y brindar una garantía de que siempre podrán calcular el hash con el mismo método que el contrato compilado de hoy. Algo sencillo...

function hashHelper(uint value) public pure returns(bytes32 hash) {
  return keccak256(value);
}

La idea sería usar la misma función internamente, evitando así posibles divergencias futuras entre el bytecode compilado y clientes de todas las formas y tamaños.

Espero eso ayude.

Realmente no entiendo a qué te refieres. ¿Estás diciendo que debería haber regresado en lugar de declarar público temporal?
Podría ser más claro si / cuando escribe el lado del cliente en esto, es decir, resuelve la biblioteca y la sintaxis para usar para calcular con éxito un hash de la misma manera que lo hace el contrato. El método sugerido lo simplificará en gran medida y ayudará a prepararlo para el futuro.
increíble respuesta, gracias, Sr. Hitchens!

El problema que está teniendo es que en su código Solidity, está codificando números, mientras que el convertidor en línea que está utilizando está codificando cadenas.

Si lo hace keccak256("12")en lugar de keccak256(12), obtendrá un hash que coincida con el del sitio web.

Gracias por tu ayuda. Pero todavía no está funcionando.
¿Qué quieres decir con "no funciona"? ¿Cuál es su código actual, qué resultado obtiene y qué obtiene del sitio web que encontró?
Edité la pregunta en la que publiqué el código actual y los resultados.
No está claro cómo está llamando a las funciones, pero supongo que todavía está pasando números en lugar de cadenas.
Asegúrese de tener comillas alrededor de 12, como esta: "12".
Si está utilizando Remix, deberá pasar la representación hexadecimal. web3.fromAscii("12") == "0x3132", así que escribe 0x3132. (Como alternativa, puede aceptar a stringen lugar de bytes. Luego puede simplemente aprobar 12).
Sí, estaba pasando números como 12. Ahora intenté pasar "12" en la función kec que da salida: 0xb884017cbf765abdf2704fdfd3bf0dccb319a13e3927726e8b48123c74895f8c
que sigue sin coincidir.
Tendrás que explicar cómo llamas a la función. web3.js? web3.py, truffle? Si alguno de esos, comparte tu código. Si es algo más, comparte el código o la herramienta que estás usando. Tal vez use capturas de pantalla si es necesario.
Por cierto, 0xb884017...es lo que obtienes cuando hash la cadena, "12" incluidas las comillas dobles (por ejemplo, si pasaste algo como '"12"'). Entonces, esto es solo un problema de codificación ... donde sea que esté escribiendo "12"comillas, las comillas también se están convirtiendo.
Estoy implementando el código e interactuando con él en myetherwallet usando ganache.