GetHashCode aus Framework integrieren

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
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:

Muggefronc

Grünschnabel
Das war nicht als Doppelpost gedacht. Es geht ja dabei um 2 verschiedene Fragen. Einmal die Portierung nach PHP und einmal nach C++. D.h. die Posts sind ja in diesem Fall nicht als doppelt zu sehen?
 
Zuletzt bearbeitet:

Muggefronc

Grünschnabel
Da such ich die ganze Zeit an der falschen Stelle...*tztz*
Die Funktion ist einwandfrei. Hab im Eifer des Gefechts nen falschen String übergeben. :rolleyes: