Object.GetHashCode()[
^] won't work for that:
"Furthermore, the .NET Framework does not guarantee the default implementation of the GetHashCode method, and the value this method returns may differ between .NET Framework versions and platforms, such as 32-bit and 64-bit platforms."
Your second requirement "Any two non-identical inputs must not share the same hash" is difficoult for any hash function.
A hash function, per definition, creates a fixed-length byte sequence from any given input. So there's a given maximum number of non-repeating outputs. You simply cannot guarantee that there's no junction in your set of a few thousand inputs.
If you can already define all possible inputs, write a software that
1) creates all of them
2) for each of them creates a hash, random number, consecutive number, whatever
3) checks if output equals any already existing output
4) while (3), repeat (2)
5) store all this in a look-up-table
At runtime, use the LUT instead of a function.