Jhash

#include <Windows.h>

SIZE_T StringLengthW(_In_ LPCWSTR String)
{
	LPCWSTR String2;

	for (String2 = String; *String2; ++String2);

	return (String2 - String);
}

UINT32 RotateToLeft32(UINT32 x, UINT32 Rotate)
{
    return (x << Rotate) | (x >> (32 - Rotate));
}

UINT32 HashStringJHash32W(PWCHAR String, SIZE_T Length, UINT32 Seed)
{
    PBYTE Pointer = (PBYTE)String;
    UINT32 State0 = 0xdeadbeefU + (UINT32)Length + Seed;
    UINT32 State1 = State0;
    UINT32 State2 = State0;

    switch (Length) 
    {
        case 18: State2 += (UINT32)Pointer[17] << 8;
        case 17: State2 += (UINT32)Pointer[16];
        case 16: State1 += (UINT32)Pointer[15] << 24;
        case 15: State1 += (UINT32)Pointer[14] << 16;
        case 14: State1 += (UINT32)Pointer[13] << 8;
        case 13: State1 += (UINT32)Pointer[12];
        case 12: State0 += (UINT32)Pointer[11] << 24;
        case 11: State0 += (UINT32)Pointer[10] << 16;
        case 10: State0 += (UINT32)Pointer[9] << 8;
        case 9: State0 += (UINT32)Pointer[8];
        case 8: State1 += (UINT32)Pointer[7] << 24;
        case 7: State1 += (UINT32)Pointer[6] << 16;
        case 6: State1 += (UINT32)Pointer[5] << 8;
        case 5: State1 += (UINT32)Pointer[4];
        case 4: State0 += (UINT32)Pointer[3] << 24;
        case 3: State0 += (UINT32)Pointer[2] << 16;
        case 2: State0 += (UINT32)Pointer[1] << 8;
        case 1: State0 += (UINT32)Pointer[0];
        default: break;
    }

    State2 ^= State1; State2 -= RotateToLeft32(State1, 14);
    State0 ^= State2; State0 -= RotateToLeft32(State2, 11);
    State1 ^= State0; State1 -= RotateToLeft32(State0, 25);
    State2 ^= State1; State2 -= RotateToLeft32(State1, 16);
    State0 ^= State2; State0 -= RotateToLeft32(State2, 4);
    State1 ^= State0; State1 -= RotateToLeft32(State0, 14);
    State2 ^= State1; State2 -= RotateToLeft32(State1, 24);

    return State2;
}

INT main(VOID)
{
    WCHAR StringHashExample[] = L"Hash This String";
    UINT32 Hash = 0;

    Hash = HashStringJHash32W(StringHashExample, (StringLengthW(StringHashExample) * sizeof(WCHAR)), 1);

    return ERROR_SUCCESS;
}

Last updated