Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

437 lines
12 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose: Variant Pearson Hash general purpose hashing algorithm described
  4. // by Cargill in C++ Report 1994. Generates a 16-bit result.
  5. //
  6. //=============================================================================
  7. #include <stdlib.h>
  8. #include "tier0/basetypes.h"
  9. #include "tier0/platform.h"
  10. #include "generichash.h"
  11. #include <ctype.h>
  12. #include "tier0/dbg.h"
  13. // NOTE: This has to be the last file included!
  14. #include "tier0/memdbgon.h"
  15. //-----------------------------------------------------------------------------
  16. //
  17. // Table of randomly shuffled values from 0-255 generated by:
  18. //
  19. //-----------------------------------------------------------------------------
  20. /*
  21. void MakeRandomValues()
  22. {
  23. int i, j, r;
  24. unsigned t;
  25. srand( 0xdeadbeef );
  26. for ( i = 0; i < 256; i++ )
  27. {
  28. g_nRandomValues[i] = (unsigned )i;
  29. }
  30. for (j = 0; j < 8; j++)
  31. {
  32. for (i = 0; i < 256; i++)
  33. {
  34. r = rand() & 0xff;
  35. t = g_nRandomValues[i];
  36. g_nRandomValues[i] = g_nRandomValues[r];
  37. g_nRandomValues[r] = t;
  38. }
  39. }
  40. printf("static unsigned g_nRandomValues[256] =\n{\n");
  41. for (i = 0; i < 256; i += 16)
  42. {
  43. printf("\t");
  44. for (j = 0; j < 16; j++)
  45. printf(" %3d,", g_nRandomValues[i+j]);
  46. printf("\n");
  47. }
  48. printf("};\n");
  49. }
  50. */
  51. static unsigned g_nRandomValues[256] =
  52. {
  53. 238, 164, 191, 168, 115, 16, 142, 11, 213, 214, 57, 151, 248, 252, 26, 198,
  54. 13, 105, 102, 25, 43, 42, 227, 107, 210, 251, 86, 66, 83, 193, 126, 108,
  55. 131, 3, 64, 186, 192, 81, 37, 158, 39, 244, 14, 254, 75, 30, 2, 88,
  56. 172, 176, 255, 69, 0, 45, 116, 139, 23, 65, 183, 148, 33, 46, 203, 20,
  57. 143, 205, 60, 197, 118, 9, 171, 51, 233, 135, 220, 49, 71, 184, 82, 109,
  58. 36, 161, 169, 150, 63, 96, 173, 125, 113, 67, 224, 78, 232, 215, 35, 219,
  59. 79, 181, 41, 229, 149, 153, 111, 217, 21, 72, 120, 163, 133, 40, 122, 140,
  60. 208, 231, 211, 200, 160, 182, 104, 110, 178, 237, 15, 101, 27, 50, 24, 189,
  61. 177, 130, 187, 92, 253, 136, 100, 212, 19, 174, 70, 22, 170, 206, 162, 74,
  62. 247, 5, 47, 32, 179, 117, 132, 195, 124, 123, 245, 128, 236, 223, 12, 84,
  63. 54, 218, 146, 228, 157, 94, 106, 31, 17, 29, 194, 34, 56, 134, 239, 246,
  64. 241, 216, 127, 98, 7, 204, 154, 152, 209, 188, 48, 61, 87, 97, 225, 85,
  65. 90, 167, 155, 112, 145, 114, 141, 93, 250, 4, 201, 156, 38, 89, 226, 196,
  66. 1, 235, 44, 180, 159, 121, 119, 166, 190, 144, 10, 91, 76, 230, 221, 80,
  67. 207, 55, 58, 53, 175, 8, 6, 52, 68, 242, 18, 222, 103, 249, 147, 129,
  68. 138, 243, 28, 185, 62, 59, 240, 202, 234, 99, 77, 73, 199, 137, 95, 165,
  69. };
  70. //-----------------------------------------------------------------------------
  71. // String
  72. //-----------------------------------------------------------------------------
  73. unsigned FASTCALL HashString( const char *pszKey )
  74. {
  75. const uint8 *k = (const uint8 *)pszKey;
  76. unsigned even = 0,
  77. odd = 0,
  78. n;
  79. while ((n = *k++) != 0)
  80. {
  81. even = g_nRandomValues[odd ^ n];
  82. if ((n = *k++) != 0)
  83. odd = g_nRandomValues[even ^ n];
  84. else
  85. break;
  86. }
  87. return (even << 8) | odd ;
  88. }
  89. //-----------------------------------------------------------------------------
  90. // Case-insensitive string
  91. //-----------------------------------------------------------------------------
  92. unsigned FASTCALL HashStringCaseless( const char *pszKey )
  93. {
  94. const uint8 *k = (const uint8 *) pszKey;
  95. unsigned even = 0,
  96. odd = 0,
  97. n;
  98. while ((n = toupper(*k++)) != 0)
  99. {
  100. even = g_nRandomValues[odd ^ n];
  101. if ((n = toupper(*k++)) != 0)
  102. odd = g_nRandomValues[even ^ n];
  103. else
  104. break;
  105. }
  106. return (even << 8) | odd;
  107. }
  108. //-----------------------------------------------------------------------------
  109. // 32 bit conventional case-insensitive string
  110. //-----------------------------------------------------------------------------
  111. unsigned FASTCALL HashStringCaselessConventional( const char *pszKey )
  112. {
  113. unsigned hash = 0xAAAAAAAA; // Alternating 1's and 0's to maximize the effect of the later multiply and add
  114. for( ; *pszKey ; pszKey++ )
  115. {
  116. hash = ( ( hash << 5 ) + hash ) + (uint8)tolower(*pszKey);
  117. }
  118. return hash;
  119. }
  120. //-----------------------------------------------------------------------------
  121. // int hash
  122. //-----------------------------------------------------------------------------
  123. unsigned FASTCALL HashInt( const int n )
  124. {
  125. unsigned even, odd;
  126. even = g_nRandomValues[n & 0xff];
  127. odd = g_nRandomValues[((n >> 8) & 0xff)];
  128. even = g_nRandomValues[odd ^ (n >> 24)];
  129. odd = g_nRandomValues[even ^ ((n >> 16) & 0xff)];
  130. even = g_nRandomValues[odd ^ ((n >> 8) & 0xff)];
  131. odd = g_nRandomValues[even ^ (n & 0xff)];
  132. return (even << 8) | odd;
  133. }
  134. //-----------------------------------------------------------------------------
  135. // 4-byte hash
  136. //-----------------------------------------------------------------------------
  137. unsigned FASTCALL Hash4( const void *pKey )
  138. {
  139. const uint32 * p = (const uint32 *) pKey;
  140. unsigned even,
  141. odd,
  142. n;
  143. n = *p;
  144. even = g_nRandomValues[n & 0xff];
  145. odd = g_nRandomValues[((n >> 8) & 0xff)];
  146. even = g_nRandomValues[odd ^ (n >> 24)];
  147. odd = g_nRandomValues[even ^ ((n >> 16) & 0xff)];
  148. even = g_nRandomValues[odd ^ ((n >> 8) & 0xff)];
  149. odd = g_nRandomValues[even ^ (n & 0xff)];
  150. return (even << 8) | odd;
  151. }
  152. //-----------------------------------------------------------------------------
  153. // 8-byte hash
  154. //-----------------------------------------------------------------------------
  155. unsigned FASTCALL Hash8( const void *pKey )
  156. {
  157. const uint32 * p = (const uint32 *) pKey;
  158. unsigned even,
  159. odd,
  160. n;
  161. n = *p;
  162. even = g_nRandomValues[n & 0xff];
  163. odd = g_nRandomValues[((n >> 8) & 0xff)];
  164. even = g_nRandomValues[odd ^ (n >> 24)];
  165. odd = g_nRandomValues[even ^ ((n >> 16) & 0xff)];
  166. even = g_nRandomValues[odd ^ ((n >> 8) & 0xff)];
  167. odd = g_nRandomValues[even ^ (n & 0xff)];
  168. n = *(p+1);
  169. even = g_nRandomValues[odd ^ (n >> 24)];
  170. odd = g_nRandomValues[even ^ ((n >> 16) & 0xff)];
  171. even = g_nRandomValues[odd ^ ((n >> 8) & 0xff)];
  172. odd = g_nRandomValues[even ^ (n & 0xff)];
  173. return (even << 8) | odd;
  174. }
  175. //-----------------------------------------------------------------------------
  176. // 12-byte hash
  177. //-----------------------------------------------------------------------------
  178. unsigned FASTCALL Hash12( const void *pKey )
  179. {
  180. const uint32 * p = (const uint32 *) pKey;
  181. unsigned even,
  182. odd,
  183. n;
  184. n = *p;
  185. even = g_nRandomValues[n & 0xff];
  186. odd = g_nRandomValues[((n >> 8) & 0xff)];
  187. even = g_nRandomValues[odd ^ (n >> 24)];
  188. odd = g_nRandomValues[even ^ ((n >> 16) & 0xff)];
  189. even = g_nRandomValues[odd ^ ((n >> 8) & 0xff)];
  190. odd = g_nRandomValues[even ^ (n & 0xff)];
  191. n = *(p+1);
  192. even = g_nRandomValues[odd ^ (n >> 24)];
  193. odd = g_nRandomValues[even ^ ((n >> 16) & 0xff)];
  194. even = g_nRandomValues[odd ^ ((n >> 8) & 0xff)];
  195. odd = g_nRandomValues[even ^ (n & 0xff)];
  196. n = *(p+2);
  197. even = g_nRandomValues[odd ^ (n >> 24)];
  198. odd = g_nRandomValues[even ^ ((n >> 16) & 0xff)];
  199. even = g_nRandomValues[odd ^ ((n >> 8) & 0xff)];
  200. odd = g_nRandomValues[even ^ (n & 0xff)];
  201. return (even << 8) | odd;
  202. }
  203. //-----------------------------------------------------------------------------
  204. // 16-byte hash
  205. //-----------------------------------------------------------------------------
  206. unsigned FASTCALL Hash16( const void *pKey )
  207. {
  208. const uint32 * p = (const uint32 *) pKey;
  209. unsigned even,
  210. odd,
  211. n;
  212. n = *p;
  213. even = g_nRandomValues[n & 0xff];
  214. odd = g_nRandomValues[((n >> 8) & 0xff)];
  215. even = g_nRandomValues[odd ^ (n >> 24)];
  216. odd = g_nRandomValues[even ^ ((n >> 16) & 0xff)];
  217. even = g_nRandomValues[odd ^ ((n >> 8) & 0xff)];
  218. odd = g_nRandomValues[even ^ (n & 0xff)];
  219. n = *(p+1);
  220. even = g_nRandomValues[odd ^ (n >> 24)];
  221. odd = g_nRandomValues[even ^ ((n >> 16) & 0xff)];
  222. even = g_nRandomValues[odd ^ ((n >> 8) & 0xff)];
  223. odd = g_nRandomValues[even ^ (n & 0xff)];
  224. n = *(p+2);
  225. even = g_nRandomValues[odd ^ (n >> 24)];
  226. odd = g_nRandomValues[even ^ ((n >> 16) & 0xff)];
  227. even = g_nRandomValues[odd ^ ((n >> 8) & 0xff)];
  228. odd = g_nRandomValues[even ^ (n & 0xff)];
  229. n = *(p+3);
  230. even = g_nRandomValues[odd ^ (n >> 24)];
  231. odd = g_nRandomValues[even ^ ((n >> 16) & 0xff)];
  232. even = g_nRandomValues[odd ^ ((n >> 8) & 0xff)];
  233. odd = g_nRandomValues[even ^ (n & 0xff)];
  234. return (even << 8) | odd;
  235. }
  236. //-----------------------------------------------------------------------------
  237. // Arbitrary fixed length hash
  238. //-----------------------------------------------------------------------------
  239. unsigned FASTCALL HashBlock( const void *pKey, unsigned size )
  240. {
  241. const uint8 * k = (const uint8 *) pKey;
  242. unsigned even = 0,
  243. odd = 0,
  244. n;
  245. while (size)
  246. {
  247. --size;
  248. n = *k++;
  249. even = g_nRandomValues[odd ^ n];
  250. if (size)
  251. {
  252. --size;
  253. n = *k++;
  254. odd = g_nRandomValues[even ^ n];
  255. }
  256. else
  257. break;
  258. }
  259. return (even << 8) | odd;
  260. }
  261. //-----------------------------------------------------------------------------
  262. // Murmur hash
  263. //-----------------------------------------------------------------------------
  264. uint32 MurmurHash2( const void * key, int len, uint32 seed )
  265. {
  266. // 'm' and 'r' are mixing constants generated offline.
  267. // They're not really 'magic', they just happen to work well.
  268. const uint32 m = 0x5bd1e995;
  269. const int r = 24;
  270. // Initialize the hash to a 'random' value
  271. uint32 h = seed ^ len;
  272. // Mix 4 bytes at a time into the hash
  273. const unsigned char * data = (const unsigned char *)key;
  274. while(len >= 4)
  275. {
  276. uint32 k = LittleDWord( *(uint32 *)data );
  277. k *= m;
  278. k ^= k >> r;
  279. k *= m;
  280. h *= m;
  281. h ^= k;
  282. data += 4;
  283. len -= 4;
  284. }
  285. // Handle the last few bytes of the input array
  286. switch(len)
  287. {
  288. case 3: h ^= data[2] << 16;
  289. case 2: h ^= data[1] << 8;
  290. case 1: h ^= data[0];
  291. h *= m;
  292. };
  293. // Do a few final mixes of the hash to ensure the last few
  294. // bytes are well-incorporated.
  295. h ^= h >> 13;
  296. h *= m;
  297. h ^= h >> 15;
  298. return h;
  299. }
  300. #define TOLOWERU( c ) ( ( uint32 ) ( ( ( c >= 'A' ) && ( c <= 'Z' ) )? c + 32 : c ) )
  301. uint32 MurmurHash2LowerCase( char const *pString, uint32 nSeed )
  302. {
  303. int nLen = ( int )strlen( pString );
  304. char *p = ( char * ) stackalloc( nLen + 1 );
  305. for( int i = 0; i < nLen ; i++ )
  306. {
  307. p[i] = TOLOWERU( pString[i] );
  308. }
  309. return MurmurHash2( p, nLen, nSeed );
  310. }
  311. //-----------------------------------------------------------------------------
  312. // Murmur hash, 64 bit- endian neutral
  313. //-----------------------------------------------------------------------------
  314. uint64 MurmurHash64( const void * key, int len, uint32 seed )
  315. {
  316. // 'm' and 'r' are mixing constants generated offline.
  317. // They're not really 'magic', they just happen to work well.
  318. const uint32 m = 0x5bd1e995;
  319. const int r = 24;
  320. // Initialize the hash to a 'random' value
  321. uint32 h1 = seed ^ len;
  322. uint32 h2 = 0;
  323. // Mix 4 bytes at a time into the hash
  324. const uint32 * data = (const uint32 *)key;
  325. while ( len >= 8 )
  326. {
  327. uint32 k1 = LittleDWord( *data++ );
  328. k1 *= m; k1 ^= k1 >> r; k1 *= m;
  329. h1 *= m; h1 ^= k1;
  330. len -= 4;
  331. uint32 k2 = LittleDWord( *data++ );
  332. k2 *= m; k2 ^= k2 >> r; k2 *= m;
  333. h2 *= m; h2 ^= k2;
  334. len -= 4;
  335. }
  336. if(len >= 4)
  337. {
  338. uint32 k1 = LittleDWord( *data++ );
  339. k1 *= m; k1 ^= k1 >> r; k1 *= m;
  340. h1 *= m; h1 ^= k1;
  341. len -= 4;
  342. }
  343. // Handle the last few bytes of the input array
  344. switch(len)
  345. {
  346. case 3: h2 ^= ((uint8*)data)[2] << 16;
  347. case 2: h2 ^= ((uint8*)data)[1] << 8;
  348. case 1: h2 ^= ((uint8*)data)[0];
  349. h2 *= m;
  350. };
  351. h1 ^= h2 >> 18; h1 *= m;
  352. h2 ^= h1 >> 22; h2 *= m;
  353. h1 ^= h2 >> 17; h1 *= m;
  354. h2 ^= h1 >> 19; h2 *= m;
  355. uint64 h = h1;
  356. h = (h << 32) | h2;
  357. return h;
  358. }