I have a function in a smart contract:

  function getNumberHash(uint8[] _numbers) constant public returns (bytes32) {
    return keccak256(_numbers);

When I pass [1,2,3,4,5] as the argument it returns:

"0": "bytes32: 0x5917e5a395fb9b454434de59651d36822a9e29c5ec57474df3e67937b969460c"

I have this Python script but it returns a different hash:

import sha3
import numpy as np

a = np.array([1, 2, 3, 4, 5], dtype=np.uint8)

k = sha3.keccak_256()

Which returns the following hash:


Why aren't the two functions returning the same value since they are both uint8[] and using the same keccak256 algorithm? How can I resolve this issue?

1 Answer 1


Web3.soliditySha3() will give you the correct hash.

The underlying reason is that solidity 0-pads values in arrays, which you won't get by default in most implementations. web3.py has the convenience method just for this purpose.

In this example, you would use:

from web3 import Web3
hash = Web3.soliditySha3(['uint8[]'], [[1, 2, 3, 4, 5]])
assert hash.hex() == '0x5917e5a395fb9b454434de59651d36822a9e29c5ec57474df3e67937b969460c'

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.