Un contrato inteligente necesita verificar la unicidad de un número dentro de una serie. La serie se especifica mediante una cadena y el número mediante un tipo uint256. ¿Hay alguna manera fácil en Solidity de calcular un hash a partir de estos dos parámetros mixtos?
Este hash será muy útil para identificar de forma única los elementos correspondientes, mejor que usar la cadena y el número. ¿Cuál será el mejor tipo para el hash resultante? ¿Una cadena o un bytes32? ¡Gracias!
Otra corrección (2019-05-17): en la versión moderna de Solidity, ya no puede pasar múltiples argumentos a keccak256
. Ahora solo toma un argumento de tipo bytes
. Todavía puede mezclar varios valores juntos de esta manera:
function hashSeriesNumber(string calldata series, uint256 number) external pure returns (bytes32)
{
return keccak256(abi.encode(number, series));
}
Corrección gracias a @Ismael: la forma más fácil y económica es simplemente pasar múltiples argumentos a la función hash:
function hashSeriesNumber(string series, uint256 number) public pure returns (bytes32)
{
return keccak256(number, series);
}
Creo que la forma más fácil es tomar el hash de uint256
, luego tomar el hash de string
y luego xor
juntos:
function hasher(uint256 i, string str) public pure returns (bytes32)
{
return keccak256(i) ^ keccak256(str);
}
Los hashes generalmente se almacenan en bytes32
, no en a string
, porque string
cuestan más gas y las funciones hash devuelven a bytes32
de todos modos.
ismael
sha3
acepta múltiples parámetros, por lo que puede hacersha3("ehlo", 0x4321)
. El resultado de sha3 esbytes32
.