According to microsoft :
HRESULT is a 32-bit value, divided into three different fields: a
severity code, an installation code and an error code. The
Severity code indicates whether the return value represents
information, warning or error. The installation code identifies
the area of the system responsible for the error. The error code is a
unique number that is assigned to represent the exception. Each
exception is assigned to a different HRESULT.
Notice that it says to each exception, not to each type of exception what is different. In your case always return the same codes because you are returning the same error on the same circumstances which causes the same code is always created. Now, if the circumstances vary, then the error code would be different.
Wikipedia explains in more detail what each portion of the code means.
So I, you, trust me with the exception type, not the code