1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
class Program {
static void Main(string[] args) {
var rnd = new Random();
for (int i = 0; i < 1000; i++) {
var str = RandomString(rnd.Next(10, 100));
var hashOrig = str.GetHashCode();
var hashNew = GetHashCode(str);
if (hashOrig != hashNew) {
Console.WriteLine("Erreur");
System.Diagnostics.Debugger.Break();
}
}
}
public static string RandomString(int size) {
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
var stringChars = new char[size];
var random = new Random();
for (int i = 0; i < stringChars.Length; i++) {
stringChars[i] = chars[random.Next(chars.Length)];
}
return new String(stringChars);
}
public static unsafe int GetHashCode(string str) {
if (IntPtr.Size == 4) { // x86
fixed (char* chPtr = str) {
int num1 = 352654597;
int num2 = num1;
int* numPtr = (int*)chPtr;
for (int length = str.Length; length > 0; length -= 4) {
num1 = (num1 << 5) + num1 + (num1 >> 27) ^ *numPtr;
if (length > 2) {
num2 = (num2 << 5) + num2 + (num2 >> 27) ^ numPtr[1];
numPtr += 2;
} else
break;
}
return num1 + num2 * 1566083941;
}
} else { // x64
fixed (char* chPtr1 = str) {
int num1 = 5381;
int num2 = num1;
int num3;
for (char* chPtr2 = chPtr1; (num3 = (int)*chPtr2) != 0; chPtr2 += 2) {
num1 = (num1 << 5) + num1 ^ num3;
int num4 = (int)chPtr2[1];
if (num4 != 0)
num2 = (num2 << 5) + num2 ^ num4;
else
break;
}
return num1 + num2 * 1566083941;
}
}
}
} |
Partager