Muggefronc
Grünschnabel
Hi,
bekannterweise ist nicht garantiert, dass die Funktion GetHashCode im .NET Framework in verschiedenen Frameworkversionen die gleichen Werte ausgibt. Dummerweise wurde unter Verwendung von GetHashCode eine Datenbank erstellt, auf die ich nun zugreifen muss. Mit dem FW 3.0 funktioniert es wunderbar also wollte ich um sicher zu gehen, dass mit zukünftigen FW-Versionen keine bösen überraschungen entstehen diese funktion selbst in meinem Code einbauen. Dazu hab ich mit Reflector die den Originalcode geholt und eingebaut. Allerdings liefert meine eingebaute variante andere Ergebnisse.
Hat jemand ne Ahnung woran das liegen kann?
das Original
meine Variante
bekannterweise ist nicht garantiert, dass die Funktion GetHashCode im .NET Framework in verschiedenen Frameworkversionen die gleichen Werte ausgibt. Dummerweise wurde unter Verwendung von GetHashCode eine Datenbank erstellt, auf die ich nun zugreifen muss. Mit dem FW 3.0 funktioniert es wunderbar also wollte ich um sicher zu gehen, dass mit zukünftigen FW-Versionen keine bösen überraschungen entstehen diese funktion selbst in meinem Code einbauen. Dazu hab ich mit Reflector die den Originalcode geholt und eingebaut. Allerdings liefert meine eingebaute variante andere Ergebnisse.
Hat jemand ne Ahnung woran das liegen kann?
das Original
Code:
[ReliabilityContract(Consistency::WillNotCorruptState, Cer::MayFail)]
public: override Int32 __gc* GetHashCode()
{
fixed (Char __gc** str = *static_cast<__box Char __gc***>(this))
{
Char __gc** chPtr = str;
Int32 __gc* num = 0x15051505;
Int32 __gc* num2 = num;
Int32 __gc** numPtr = *static_cast<__box Int32 __gc***>(chPtr);
for (Int32 __gc* i = this->Length; (i > 0); i -= 4)
{
num = ((((num << 5) + num) + (num >> 0x1b)) ^ numPtr[0]);
if (i <= 2)
{
break;
}
num2 = ((((num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr[1]);
numPtr += 2;
}
return (num + (num2 * 0x5d588b65));
}
}
meine Variante
Code:
int GetHashCode(String^ str)
{
__int32 num = 0x15051505;
__int32 num2 = num;
__int32* numPtr=(__int32*)(Marshal::StringToHGlobalUni(str).ToPointer());
for (__int32 i = str->Length; (i > 0); i -= 4)
{
num = ((((num << 5) + num) + (num >> 0x1b)) ^ numPtr[0]);
if (i <= 2)
{
break;
}
num2 = ((((num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr[1]);
numPtr += 2;
}
return (num + (num2 * 0x5d588b65));
}
Zuletzt bearbeitet: