Cree un hash a partir de una cadena y un número uint256 en Solidity

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!

La documentación de solidy sha3 acepta múltiples parámetros, por lo que puede hacer sha3("ehlo", 0x4321). El resultado de sha3 es bytes32.

Respuestas (1)

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 stringy luego xorjuntos:

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 stringcuestan más gas y las funciones hash devuelven a bytes32de todos modos.