KoA: Reckoning Hashing Functions

Information and research into the KoA: Reckoning game files and main game executable.
Post Reply
User avatar
atom0s
Site Admin
Posts: 33
Joined: Sun Apr 08, 2018 2:54 pm
Location: 127.0.0.1
Contact:

KoA: Reckoning Hashing Functions

Post by atom0s » Thu Apr 12, 2018 8:14 pm

Here are the main two functions used for creating string hashes that are using in Reckoning. These are used for things like lookup tables (hash maps) or similar. Reckoning uses hashes a lot to save file space by turning strings into 32bit integer hashes.

This data is based on the v1.0.0.2 Steam executable of the game.
  1. int __cdecl sub_8DDE40(const char *a1, _DWORD *a2)
  2. {
  3.   const char *v2; // ecx@1
  4.   int result; // eax@2
  5.   unsigned int v4; // eax@3
  6.   signed int v5; // edi@3
  7.   unsigned int v6; // ebx@4
  8.   unsigned int v7; // esi@6
  9.   int v8; // ebp@6
  10.   unsigned int v9; // ST1C_4@6
  11.   int v10; // edx@6
  12.   int v11; // [sp+4h] [bp-Ch]@3
  13.   int v12; // [sp+8h] [bp-8h]@3
  14.  
  15.   v2 = a1;
  16.   if ( a1 )
  17.   {
  18.     v12 = 0;
  19.     v11 = 0;
  20.     v4 = strlen(a1);
  21.     v5 = v4 - 1;
  22.     if ( ((v4 - 1) & 0x80000000) == 0 )
  23.     {
  24.       v6 = v4;
  25.       while ( 1 )
  26.       {
  27.         v7 = v2[v6 - 1];
  28.         v8 = v5 % 0x32;
  29.         v9 = tolower(v7);
  30.         v12 += v6 * dword_B747C0[v7 % 0x32] + v7 * dword_B747C0[v5 % 0x32];
  31.         v10 = v6 * dword_B747C0[v9 % 0x32];
  32.         --v5;
  33.         --v6;
  34.         v11 += v10 + v9 * dword_B747C0[v8];
  35.         if ( v5 < 0 )
  36.           break;
  37.         v2 = a1;
  38.       }
  39.     }
  40.     *a2 = v11;
  41.     result = v12;
  42.   }
  43.   else
  44.   {
  45.     result = 0;
  46.   }
  47.   return result;
  48. }
  1. int __usercall sub_8DDC90@<eax>(int result@<eax>, int a2@<ecx>, int a3)
  2. {
  3.   int v3; // ebx@2
  4.   signed int v4; // esi@2
  5.   int v5; // edi@3
  6.   unsigned int v6; // eax@4
  7.   int v7; // ebp@4
  8.   int v8; // eax@4
  9.   int v9; // [sp+0h] [bp-4h]@3
  10.  
  11.   if ( result )
  12.   {
  13.     v3 = 0;
  14.     v4 = a3 - 1;
  15.     if ( a3 - 1 >= 0 )
  16.     {
  17.       v5 = a3;
  18.       v9 = a2 + result;
  19.       do
  20.       {
  21.         v6 = tolower(*(_BYTE *)(v9 + v4));
  22.         v7 = v5 * dword_B747C0[v6 % 0x32];
  23.         v8 = v3 + v6 * dword_B747C0[v4-- % 50];
  24.         --v5;
  25.         v3 = v8 + v7;
  26.       }
  27.       while ( v4 >= 0 );
  28.     }
  29.     result = v3;
  30.   }
  31.   return result;
  32. }
Site Owner

Want to donate to say thanks? Donate via Paypal
https://www.paypal.me/atom0s
Post Reply