public static PayloadIdentifier forPayloadParams(
      final Hash parentHash,
      final Long timestamp,
      final Bytes32 prevRandao,
      final Address feeRecipient,
      final Optional<List<Withdrawal>> withdrawals,
      final Optional<Bytes32> parentBeaconBlockRoot) {

    return new PayloadIdentifier(
        timestamp
            ^ ((long) parentHash.toHexString().hashCode()) << 8
            ^ ((long) prevRandao.toHexString().hashCode()) << 16
            ^ ((long) feeRecipient.toHexString().hashCode()) << 24
            ^ (long)
                withdrawals
                    .map(
                        ws ->
                            ws.stream()
                                .sorted(Comparator.comparing(Withdrawal::getIndex))
                                .map(Withdrawal::hashCode)
                                .reduce(1, (a, b) -> a ^ (b * 31)))
                    .orElse(0)
            ^ ((long) parentBeaconBlockRoot.hashCode()) << 40);
  }
Create payload identifier for payload params. This is a deterministic hash of all payload
parameters that aims to avoid collisions

@param parentHash the parent hash
@param timestamp the timestamp
@param prevRandao the prev randao
@param feeRecipient the fee recipient
@param withdrawals the withdrawals
@param parentBeaconBlockRoot the parent beacon block root
@return the payload identifier
consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/PayloadIdentifier.java