I found this information in the doc of OpenZeppelin for v.4.x here
First, what is an operation? it is a transaction (or a set of transactions) that is the subject of the timelock. It has to be scheduled by a proposer and executed by an executor here
the hashOperation function: Returns the identifier of an operation containing a single transaction here.
An Operation contains here:
Target: the address of the smart contract that the timelock should operate on.
Value: in wei, that should be sent with the transaction. Most of the time this will be 0. Ether can be deposited before-end or passed along when executing the transaction.
Data: containing the encoded function selector and parameters of the call. This can be produced using a number of tools. For example, a maintenance operation granting role ROLE to ACCOUNT can be encode using web3js as follows:
const data = timelock.contract.methods.grantRole(ROLE,
Predecessor: that specifies a dependency between operations. This dependency is optional. Use bytes32(0) if the operation does not have any dependency.
Salt: used to disambiguate two otherwise identical operations. This can be any random value.