A variety of hashing algorithms are used throughout the Bitcoin Cash protocol.
This specification does not explain what hashes are, nor the details of the specific hashing algorithms used, as that is covered well elsewhere.
Instead, this page will focus on which hashing algorithms are used, where they are used, and why they are used there.
SHA-256 is widely used throughout the Bitcoin Cash protocol to identify blocks and transactions along with a variety of purposes in transaction scripts.
The most notable uses of SHA-256 are:
D5D27987D2A3DFC724E359870C6644B40E497BDC0589A033220FE15429D88599
E3BF3D07D4B0375638D5F1DB5255FE07BA2C4CB067CD81B84EE974B6585FB468
In contrast to many other protocols, Bitcoin Cash sometimes treats block and transaction hashes as a number, for example when comparing with block difficulty during block validation or mining.
In these situations, the output byte array of the hashing algorithm is interpreted as a 256 bit number in little-endian format, particularly when transmitted over the network.
This is the opposite of standard protocol design, so it may be simpler to think of hashes as byte arrays that occasionally are turned into little-endian numbers, than as numbers with a lot of display/encoding caveats.
RIPEMD-160 is used in Bitcoin Cash scripts to create short, quasi-anonymous representations of payees for transactions.
Since its brevity is also a potential liability for the anonymity it provides (since shorter hashes generally provide less collision-resistance), it is used in conjunction with SHA-256 when generating an address from a public key.
That is, (public key) -> SHA-256 -> RIPEMD-160 -> (address)
.
This SHA-256 then RIPEMD-160 process has its own operation for ease-of-use, OP_HASH160.
MurmurHash is used in Bitcoin to support Bloom filters.
The specific version used is the MurmurHash version 3 (32-bit), with the first hash initialized to (numberOfHashesRequired * 0xFBA4C795L + nonce)
where nonce
is a randomly chosen 32-bit unsigned integer.