public override int GetHashCode()
{
if (IsNull)
return 0;
SqlDecimal ssnumTemp;
int lActualPrec;
// First, "normalize" numeric, so that values with different
// scale/precision will have the same representation.
ssnumTemp = this;
lActualPrec = ssnumTemp.CalculatePrecision();
ssnumTemp.AdjustScale(s_NUMERIC_MAX_PRECISION - lActualPrec, true);
// Now evaluate the hash
int cDwords = ssnumTemp._bLen;
int ulValue = 0;
int ulHi;
// Size of CRC window (hashing bytes, ssstr, sswstr, numeric)
const int x_cbCrcWindow = 4;
// const int iShiftVal = (sizeof ulValue) * (8*sizeof(char)) - x_cbCrcWindow;
const int iShiftVal = 4 * 8 - x_cbCrcWindow;
int[] rgiData = ssnumTemp.Data;
for (int i = 0; i < cDwords; i++)
{
ulHi = (ulValue >> iShiftVal) & 0xff;
ulValue <<= x_cbCrcWindow;
ulValue = ulValue ^ rgiData[i] ^ ulHi;
}
return ulValue;
}