It is not possible to construct a complex-enough hash function with predictable properties (like being surjective and having equiprobable output values) from simpler non-invertible functions.
All good hash functions are made from a combination of invertible functions, over which some trick is used to make the resulting hash function non-invertible.
For instance, a non-invertible hash function (for a fixed input length) can be obtained as the sum of two invertible functions. For simplicity, one of the two invertible functions may be the identity function, as it is done in SHA-1, SHA-2 and a very large number of other frequently used hash functions.
Using such a hash function with fixed input length, there are many methods to extend it to work with a variable input length.