Muggefronc
Grünschnabel
Hallo alle...
ich habe folgendes Problem: Mit einer .NET-Anwendung wurde eine Datenbank erstellt. Bei der Erstellung wurden Strings mit GetHashCode umgewandelt und in die DB gespeichert. Jetzt muss ich mich mit PHP auf diese DB zugreifen und die Hashes mit Strings vergleichen (also ähnlich einem Passwortvergleich). Dummerweise konnte ich nirgens herausfinden mit welchem Algorithmus GetHashCode arbeitet, den brauch ich ja für den Vergleich. Zudem arbeitet GetHashCode ja scheinbar von Framework-Version zu FW-Version verschieden. In meinem Fall handelt es sich um FW 3. Kann mir da jemand weiterhelfen?
Nachtrag: Also ich bin jetzt soweit, dass ich den Code mit Reflector rausbekommen habe. Den habe ich dann in PHP übersetzt, aber leider liefert die PHP-Version ein anderes Ergebnis als GetHashCode. Hier die Quellcodes:
C++
PHP
Sieht jemand was da schiefläuft?
ich habe folgendes Problem: Mit einer .NET-Anwendung wurde eine Datenbank erstellt. Bei der Erstellung wurden Strings mit GetHashCode umgewandelt und in die DB gespeichert. Jetzt muss ich mich mit PHP auf diese DB zugreifen und die Hashes mit Strings vergleichen (also ähnlich einem Passwortvergleich). Dummerweise konnte ich nirgens herausfinden mit welchem Algorithmus GetHashCode arbeitet, den brauch ich ja für den Vergleich. Zudem arbeitet GetHashCode ja scheinbar von Framework-Version zu FW-Version verschieden. In meinem Fall handelt es sich um FW 3. Kann mir da jemand weiterhelfen?
Nachtrag: Also ich bin jetzt soweit, dass ich den Code mit Reflector rausbekommen habe. Den habe ich dann in PHP übersetzt, aber leider liefert die PHP-Version ein anderes Ergebnis als GetHashCode. Hier die Quellcodes:
C++
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));
}
}
PHP
Code:
function GetHashCode($name)
{
$num = 0x15051505;
$num2 = $num;
$numPtr=0;
$len=strlen($name);
for ($i = 0; $i < $len; $i += 4)
{
$c1=ord($name{$i});
$c2=ord($name{$i+1});
$num = ((($num << 5) + $num) + ($num >> 0x1b)) ^ (($c1<<16)|$c2);
if ($i >= $len-4)
{
break;
}
$c1=ord($name{$i+2});
$c2=ord($name{$i+3});
$num2 = ((($num2 << 5) + $num2) + ($num2 >> 0x1b)) ^ (($c1<<16)|$c2);
}
return (integer)($num + ($num2 * 0x5d588b65));
}
Sieht jemand was da schiefläuft?
Zuletzt bearbeitet: