y_stringhash.inc 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. /*----------------------------------------------------------------------------*-
  2. ========================================
  3. y_stringhash - Fast string comparisons
  4. ========================================
  5. Description:
  6. Allows you to hash strings at compile time to use them in a switch.
  7. Legal:
  8. Version: MPL 1.1
  9. The contents of this file are subject to the Mozilla Public License Version
  10. 1.1 (the "License"); you may not use this file except in compliance with
  11. the License. You may obtain a copy of the License at
  12. http://www.mozilla.org/MPL/
  13. Software distributed under the License is distributed on an "AS IS" basis,
  14. WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  15. for the specific language governing rights and limitations under the
  16. License.
  17. The Original Code is the SA:MP script information include.
  18. The Initial Developer of the Original Code is Alex "Y_Less" Cole.
  19. Portions created by the Initial Developer are Copyright (C) 2008
  20. the Initial Developer. All Rights Reserved.
  21. Contributors:
  22. ZeeX, koolk
  23. Thanks:
  24. Peter, Cam - Support.
  25. ZeeX - Very productive conversations.
  26. koolk - IsPlayerinAreaEx code.
  27. TheAlpha - Danish translation.
  28. breadfish - German translation.
  29. Fireburn - Dutch translation.
  30. yom - French translation.
  31. 50p - Polish translation.
  32. Zamaroht - Spanish translation.
  33. Dracoblue, sintax, mabako, Xtreme, other coders - Producing other modes
  34. for me to strive to better.
  35. Pixels^ - Running XScripters where the idea was born.
  36. Matite - Pestering me to release it and using it.
  37. Very special thanks to:
  38. Thiadmer - PAWN.
  39. Kye/Kalcor - SA:MP.
  40. SA:MP Team past, present and future - SA:MP.
  41. Version:
  42. 1.0
  43. Changelog:
  44. 25/10/10:
  45. Updated comments.
  46. Added to YSI 1.0.
  47. Added FNV1 and FNV1a hashes to avoid collisions.
  48. 19/08/10:
  49. First version.
  50. Functions:
  51. stock:
  52. YHash - Generate a string hash at run time.
  53. Definitions:
  54. _H - Generate a string hash at compile time.
  55. _I - Generate a case insensitive string hash at compile time.
  56. -*----------------------------------------------------------------------------*/
  57. #include <YSI\internal\y_version>
  58. // ================
  59. // Case sensitive
  60. // ================
  61. // These are the default values
  62. #define HASH(%0,%1) HASH@%0(%1)
  63. #define _H(%0) HASH(bernstein,%0)
  64. #define _H@b HASH@bernstein
  65. #define _H@f HASH@fnv1
  66. #define _H@a HASH@fnv1a
  67. // ================
  68. // Bernstein hash
  69. // ================
  70. // Signify the end with two "@" symbols.
  71. #define HASH@bernstein(%0) _REHASH@b(%0,@,@)
  72. // Internal call.
  73. #define _REHASH@b(%0,%1) _HASH@b_%0(%1)
  74. // The bit that actually does the work.
  75. #define _DOHASH@b(%0,%1,%2) (_HASH@b_%1(%2)*33+%0)
  76. // Space.
  77. #define _HASH@b_(%0) _DOHASH@b(32,%0)
  78. // Numbers.
  79. #define _HASH@b_0(%0) _DOHASH@b(48,%0)
  80. #define _HASH@b_1(%0) _DOHASH@b(49,%0)
  81. #define _HASH@b_2(%0) _DOHASH@b(50,%0)
  82. #define _HASH@b_3(%0) _DOHASH@b(51,%0)
  83. #define _HASH@b_4(%0) _DOHASH@b(52,%0)
  84. #define _HASH@b_5(%0) _DOHASH@b(53,%0)
  85. #define _HASH@b_6(%0) _DOHASH@b(54,%0)
  86. #define _HASH@b_7(%0) _DOHASH@b(55,%0)
  87. #define _HASH@b_8(%0) _DOHASH@b(56,%0)
  88. #define _HASH@b_9(%0) _DOHASH@b(57,%0)
  89. // Upper case letters.
  90. #define _HASH@b_A(%0) _DOHASH@b(65,%0)
  91. #define _HASH@b_B(%0) _DOHASH@b(66,%0)
  92. #define _HASH@b_C(%0) _DOHASH@b(67,%0)
  93. #define _HASH@b_D(%0) _DOHASH@b(68,%0)
  94. #define _HASH@b_E(%0) _DOHASH@b(69,%0)
  95. #define _HASH@b_F(%0) _DOHASH@b(70,%0)
  96. #define _HASH@b_G(%0) _DOHASH@b(71,%0)
  97. #define _HASH@b_H(%0) _DOHASH@b(72,%0)
  98. #define _HASH@b_I(%0) _DOHASH@b(73,%0)
  99. #define _HASH@b_J(%0) _DOHASH@b(74,%0)
  100. #define _HASH@b_K(%0) _DOHASH@b(75,%0)
  101. #define _HASH@b_L(%0) _DOHASH@b(76,%0)
  102. #define _HASH@b_M(%0) _DOHASH@b(77,%0)
  103. #define _HASH@b_N(%0) _DOHASH@b(78,%0)
  104. #define _HASH@b_O(%0) _DOHASH@b(79,%0)
  105. #define _HASH@b_P(%0) _DOHASH@b(80,%0)
  106. #define _HASH@b_Q(%0) _DOHASH@b(81,%0)
  107. #define _HASH@b_R(%0) _DOHASH@b(82,%0)
  108. #define _HASH@b_S(%0) _DOHASH@b(83,%0)
  109. #define _HASH@b_T(%0) _DOHASH@b(84,%0)
  110. #define _HASH@b_U(%0) _DOHASH@b(85,%0)
  111. #define _HASH@b_V(%0) _DOHASH@b(86,%0)
  112. #define _HASH@b_W(%0) _DOHASH@b(87,%0)
  113. #define _HASH@b_X(%0) _DOHASH@b(88,%0)
  114. #define _HASH@b_Y(%0) _DOHASH@b(89,%0)
  115. #define _HASH@b_Z(%0) _DOHASH@b(90,%0)
  116. // Underscore.
  117. #define _HASH@b__(%0) _DOHASH@b(95,%0)
  118. // Lower case letters.
  119. #define _HASH@b_a(%0) _DOHASH@b(97,%0)
  120. #define _HASH@b_b(%0) _DOHASH@b(98,%0)
  121. #define _HASH@b_c(%0) _DOHASH@b(99,%0)
  122. #define _HASH@b_d(%0) _DOHASH@b(100,%0)
  123. #define _HASH@b_e(%0) _DOHASH@b(101,%0)
  124. #define _HASH@b_f(%0) _DOHASH@b(102,%0)
  125. #define _HASH@b_g(%0) _DOHASH@b(103,%0)
  126. #define _HASH@b_h(%0) _DOHASH@b(104,%0)
  127. #define _HASH@b_i(%0) _DOHASH@b(105,%0)
  128. #define _HASH@b_j(%0) _DOHASH@b(106,%0)
  129. #define _HASH@b_k(%0) _DOHASH@b(107,%0)
  130. #define _HASH@b_l(%0) _DOHASH@b(108,%0)
  131. #define _HASH@b_m(%0) _DOHASH@b(109,%0)
  132. #define _HASH@b_n(%0) _DOHASH@b(110,%0)
  133. #define _HASH@b_o(%0) _DOHASH@b(111,%0)
  134. #define _HASH@b_p(%0) _DOHASH@b(112,%0)
  135. #define _HASH@b_q(%0) _DOHASH@b(113,%0)
  136. #define _HASH@b_r(%0) _DOHASH@b(114,%0)
  137. #define _HASH@b_s(%0) _DOHASH@b(115,%0)
  138. #define _HASH@b_t(%0) _DOHASH@b(116,%0)
  139. #define _HASH@b_u(%0) _DOHASH@b(117,%0)
  140. #define _HASH@b_v(%0) _DOHASH@b(118,%0)
  141. #define _HASH@b_w(%0) _DOHASH@b(119,%0)
  142. #define _HASH@b_x(%0) _DOHASH@b(120,%0)
  143. #define _HASH@b_y(%0) _DOHASH@b(121,%0)
  144. #define _HASH@b_z(%0) _DOHASH@b(122,%0)
  145. // String end.
  146. #define _HASH@b_@(%0) -1
  147. // ===========
  148. // FNV1 hash
  149. // ===========
  150. // Signify the end with two "@" symbols.
  151. #define HASH@fnv1(%0) _REHASH@f(%0,@,@)
  152. // Internal call.
  153. #define _REHASH@f(%0,%1) _HASH@f_%0(%1)
  154. // The bit that actually does the work.
  155. #define _DOHASH@f(%0,%1,%2) (_HASH@f_%1(%2)*16777619^%0)
  156. // Space.
  157. #define _HASH@f_(%0) _DOHASH@f(32,%0)
  158. // Numbers.
  159. #define _HASH@f_0(%0) _DOHASH@f(48,%0)
  160. #define _HASH@f_1(%0) _DOHASH@f(49,%0)
  161. #define _HASH@f_2(%0) _DOHASH@f(50,%0)
  162. #define _HASH@f_3(%0) _DOHASH@f(51,%0)
  163. #define _HASH@f_4(%0) _DOHASH@f(52,%0)
  164. #define _HASH@f_5(%0) _DOHASH@f(53,%0)
  165. #define _HASH@f_6(%0) _DOHASH@f(54,%0)
  166. #define _HASH@f_7(%0) _DOHASH@f(55,%0)
  167. #define _HASH@f_8(%0) _DOHASH@f(56,%0)
  168. #define _HASH@f_9(%0) _DOHASH@f(57,%0)
  169. // Upper case letters.
  170. #define _HASH@f_A(%0) _DOHASH@f(65,%0)
  171. #define _HASH@f_B(%0) _DOHASH@f(66,%0)
  172. #define _HASH@f_C(%0) _DOHASH@f(67,%0)
  173. #define _HASH@f_D(%0) _DOHASH@f(68,%0)
  174. #define _HASH@f_E(%0) _DOHASH@f(69,%0)
  175. #define _HASH@f_F(%0) _DOHASH@f(70,%0)
  176. #define _HASH@f_G(%0) _DOHASH@f(71,%0)
  177. #define _HASH@f_H(%0) _DOHASH@f(72,%0)
  178. #define _HASH@f_I(%0) _DOHASH@f(73,%0)
  179. #define _HASH@f_J(%0) _DOHASH@f(74,%0)
  180. #define _HASH@f_K(%0) _DOHASH@f(75,%0)
  181. #define _HASH@f_L(%0) _DOHASH@f(76,%0)
  182. #define _HASH@f_M(%0) _DOHASH@f(77,%0)
  183. #define _HASH@f_N(%0) _DOHASH@f(78,%0)
  184. #define _HASH@f_O(%0) _DOHASH@f(79,%0)
  185. #define _HASH@f_P(%0) _DOHASH@f(80,%0)
  186. #define _HASH@f_Q(%0) _DOHASH@f(81,%0)
  187. #define _HASH@f_R(%0) _DOHASH@f(82,%0)
  188. #define _HASH@f_S(%0) _DOHASH@f(83,%0)
  189. #define _HASH@f_T(%0) _DOHASH@f(84,%0)
  190. #define _HASH@f_U(%0) _DOHASH@f(85,%0)
  191. #define _HASH@f_V(%0) _DOHASH@f(86,%0)
  192. #define _HASH@f_W(%0) _DOHASH@f(87,%0)
  193. #define _HASH@f_X(%0) _DOHASH@f(88,%0)
  194. #define _HASH@f_Y(%0) _DOHASH@f(89,%0)
  195. #define _HASH@f_Z(%0) _DOHASH@f(90,%0)
  196. // Underscore.
  197. #define _HASH@f__(%0) _DOHASH@f(95,%0)
  198. // Lower case letters.
  199. #define _HASH@f_a(%0) _DOHASH@f(97,%0)
  200. #define _HASH@f_b(%0) _DOHASH@f(98,%0)
  201. #define _HASH@f_c(%0) _DOHASH@f(99,%0)
  202. #define _HASH@f_d(%0) _DOHASH@f(100,%0)
  203. #define _HASH@f_e(%0) _DOHASH@f(101,%0)
  204. #define _HASH@f_f(%0) _DOHASH@f(102,%0)
  205. #define _HASH@f_g(%0) _DOHASH@f(103,%0)
  206. #define _HASH@f_h(%0) _DOHASH@f(104,%0)
  207. #define _HASH@f_i(%0) _DOHASH@f(105,%0)
  208. #define _HASH@f_j(%0) _DOHASH@f(106,%0)
  209. #define _HASH@f_k(%0) _DOHASH@f(107,%0)
  210. #define _HASH@f_l(%0) _DOHASH@f(108,%0)
  211. #define _HASH@f_m(%0) _DOHASH@f(109,%0)
  212. #define _HASH@f_n(%0) _DOHASH@f(110,%0)
  213. #define _HASH@f_o(%0) _DOHASH@f(111,%0)
  214. #define _HASH@f_p(%0) _DOHASH@f(112,%0)
  215. #define _HASH@f_q(%0) _DOHASH@f(113,%0)
  216. #define _HASH@f_r(%0) _DOHASH@f(114,%0)
  217. #define _HASH@f_s(%0) _DOHASH@f(115,%0)
  218. #define _HASH@f_t(%0) _DOHASH@f(116,%0)
  219. #define _HASH@f_u(%0) _DOHASH@f(117,%0)
  220. #define _HASH@f_v(%0) _DOHASH@f(118,%0)
  221. #define _HASH@f_w(%0) _DOHASH@f(119,%0)
  222. #define _HASH@f_x(%0) _DOHASH@f(120,%0)
  223. #define _HASH@f_y(%0) _DOHASH@f(121,%0)
  224. #define _HASH@f_z(%0) _DOHASH@f(122,%0)
  225. // String end.
  226. #define _HASH@f_@(%0) 2166136261
  227. // ============
  228. // FNV1a hash
  229. // ============
  230. // Signify the end with two "@" symbols.
  231. #define HASH@fnv1a(%0) _REHASH@a(%0,@,@)
  232. // Internal call.
  233. #define _REHASH@a(%0,%1) _HASH@a_%0(%1)
  234. // The bit that actually does the work.
  235. #define _DOHASH@a(%0,%1,%2) ((_HASH@a_%1(%2)^%0)*16777619)
  236. // Space.
  237. #define _HASH@a_(%0) _DOHASH@a(32,%0)
  238. // Numbers.
  239. #define _HASH@a_0(%0) _DOHASH@a(48,%0)
  240. #define _HASH@a_1(%0) _DOHASH@a(49,%0)
  241. #define _HASH@a_2(%0) _DOHASH@a(50,%0)
  242. #define _HASH@a_3(%0) _DOHASH@a(51,%0)
  243. #define _HASH@a_4(%0) _DOHASH@a(52,%0)
  244. #define _HASH@a_5(%0) _DOHASH@a(53,%0)
  245. #define _HASH@a_6(%0) _DOHASH@a(54,%0)
  246. #define _HASH@a_7(%0) _DOHASH@a(55,%0)
  247. #define _HASH@a_8(%0) _DOHASH@a(56,%0)
  248. #define _HASH@a_9(%0) _DOHASH@a(57,%0)
  249. // Upper case letters.
  250. #define _HASH@a_A(%0) _DOHASH@a(65,%0)
  251. #define _HASH@a_B(%0) _DOHASH@a(66,%0)
  252. #define _HASH@a_C(%0) _DOHASH@a(67,%0)
  253. #define _HASH@a_D(%0) _DOHASH@a(68,%0)
  254. #define _HASH@a_E(%0) _DOHASH@a(69,%0)
  255. #define _HASH@a_F(%0) _DOHASH@a(70,%0)
  256. #define _HASH@a_G(%0) _DOHASH@a(71,%0)
  257. #define _HASH@a_H(%0) _DOHASH@a(72,%0)
  258. #define _HASH@a_I(%0) _DOHASH@a(73,%0)
  259. #define _HASH@a_J(%0) _DOHASH@a(74,%0)
  260. #define _HASH@a_K(%0) _DOHASH@a(75,%0)
  261. #define _HASH@a_L(%0) _DOHASH@a(76,%0)
  262. #define _HASH@a_M(%0) _DOHASH@a(77,%0)
  263. #define _HASH@a_N(%0) _DOHASH@a(78,%0)
  264. #define _HASH@a_O(%0) _DOHASH@a(79,%0)
  265. #define _HASH@a_P(%0) _DOHASH@a(80,%0)
  266. #define _HASH@a_Q(%0) _DOHASH@a(81,%0)
  267. #define _HASH@a_R(%0) _DOHASH@a(82,%0)
  268. #define _HASH@a_S(%0) _DOHASH@a(83,%0)
  269. #define _HASH@a_T(%0) _DOHASH@a(84,%0)
  270. #define _HASH@a_U(%0) _DOHASH@a(85,%0)
  271. #define _HASH@a_V(%0) _DOHASH@a(86,%0)
  272. #define _HASH@a_W(%0) _DOHASH@a(87,%0)
  273. #define _HASH@a_X(%0) _DOHASH@a(88,%0)
  274. #define _HASH@a_Y(%0) _DOHASH@a(89,%0)
  275. #define _HASH@a_Z(%0) _DOHASH@a(90,%0)
  276. // Underscore.
  277. #define _HASH@a__(%0) _DOHASH@a(95,%0)
  278. // Lower case letters.
  279. #define _HASH@a_a(%0) _DOHASH@a(97,%0)
  280. #define _HASH@a_b(%0) _DOHASH@a(98,%0)
  281. #define _HASH@a_c(%0) _DOHASH@a(99,%0)
  282. #define _HASH@a_d(%0) _DOHASH@a(100,%0)
  283. #define _HASH@a_e(%0) _DOHASH@a(101,%0)
  284. #define _HASH@a_f(%0) _DOHASH@a(102,%0)
  285. #define _HASH@a_g(%0) _DOHASH@a(103,%0)
  286. #define _HASH@a_h(%0) _DOHASH@a(104,%0)
  287. #define _HASH@a_i(%0) _DOHASH@a(105,%0)
  288. #define _HASH@a_j(%0) _DOHASH@a(106,%0)
  289. #define _HASH@a_k(%0) _DOHASH@a(107,%0)
  290. #define _HASH@a_l(%0) _DOHASH@a(108,%0)
  291. #define _HASH@a_m(%0) _DOHASH@a(109,%0)
  292. #define _HASH@a_n(%0) _DOHASH@a(110,%0)
  293. #define _HASH@a_o(%0) _DOHASH@a(111,%0)
  294. #define _HASH@a_p(%0) _DOHASH@a(112,%0)
  295. #define _HASH@a_q(%0) _DOHASH@a(113,%0)
  296. #define _HASH@a_r(%0) _DOHASH@a(114,%0)
  297. #define _HASH@a_s(%0) _DOHASH@a(115,%0)
  298. #define _HASH@a_t(%0) _DOHASH@a(116,%0)
  299. #define _HASH@a_u(%0) _DOHASH@a(117,%0)
  300. #define _HASH@a_v(%0) _DOHASH@a(118,%0)
  301. #define _HASH@a_w(%0) _DOHASH@a(119,%0)
  302. #define _HASH@a_x(%0) _DOHASH@a(120,%0)
  303. #define _HASH@a_y(%0) _DOHASH@a(121,%0)
  304. #define _HASH@a_z(%0) _DOHASH@a(122,%0)
  305. // String end.
  306. #define _HASH@a_@(%0) 2166136261
  307. // ==================
  308. // Case insensitive
  309. // ==================
  310. // These are the default values
  311. #define HASHi(%0,%1) HASHi@%0(%1)
  312. //#define _I(%0) _REHASib(%0,@,@)
  313. #define _I(%0) HASHi(bernstein,%0)
  314. #define _I@b HASHi@bernstein
  315. #define _I@f HASHi@fnv1
  316. #define _I@a HASHi@fnv1a
  317. // ================
  318. // Bernstein hash
  319. // ================
  320. // Signify the end with two "@" symbols.
  321. #define HASHi@bernstein(%0) _REHASH@ib(%0,@,@)
  322. // Internal call.
  323. #define _REHASH@ib(%0,%1) _HASH@ib_%0(%1)
  324. // The bit that actually does the work.
  325. #define _DOHASH@ib(%0,%1,%2) (_HASH@ib_%1(%2)*33+%0)
  326. // Space.
  327. #define _HASH@ib_(%0) _DOHASH@ib(32,%0)
  328. // Numbers.
  329. #define _HASH@ib_0(%0) _DOHASH@ib(48,%0)
  330. #define _HASH@ib_1(%0) _DOHASH@ib(49,%0)
  331. #define _HASH@ib_2(%0) _DOHASH@ib(50,%0)
  332. #define _HASH@ib_3(%0) _DOHASH@ib(51,%0)
  333. #define _HASH@ib_4(%0) _DOHASH@ib(52,%0)
  334. #define _HASH@ib_5(%0) _DOHASH@ib(53,%0)
  335. #define _HASH@ib_6(%0) _DOHASH@ib(54,%0)
  336. #define _HASH@ib_7(%0) _DOHASH@ib(55,%0)
  337. #define _HASH@ib_8(%0) _DOHASH@ib(56,%0)
  338. #define _HASH@ib_9(%0) _DOHASH@ib(57,%0)
  339. // Upper case letters.
  340. #define _HASH@ib_A(%0) _DOHASH@ib(65,%0)
  341. #define _HASH@ib_B(%0) _DOHASH@ib(66,%0)
  342. #define _HASH@ib_C(%0) _DOHASH@ib(67,%0)
  343. #define _HASH@ib_D(%0) _DOHASH@ib(68,%0)
  344. #define _HASH@ib_E(%0) _DOHASH@ib(69,%0)
  345. #define _HASH@ib_F(%0) _DOHASH@ib(70,%0)
  346. #define _HASH@ib_G(%0) _DOHASH@ib(71,%0)
  347. #define _HASH@ib_H(%0) _DOHASH@ib(72,%0)
  348. #define _HASH@ib_I(%0) _DOHASH@ib(73,%0)
  349. #define _HASH@ib_J(%0) _DOHASH@ib(74,%0)
  350. #define _HASH@ib_K(%0) _DOHASH@ib(75,%0)
  351. #define _HASH@ib_L(%0) _DOHASH@ib(76,%0)
  352. #define _HASH@ib_M(%0) _DOHASH@ib(77,%0)
  353. #define _HASH@ib_N(%0) _DOHASH@ib(78,%0)
  354. #define _HASH@ib_O(%0) _DOHASH@ib(79,%0)
  355. #define _HASH@ib_P(%0) _DOHASH@ib(80,%0)
  356. #define _HASH@ib_Q(%0) _DOHASH@ib(81,%0)
  357. #define _HASH@ib_R(%0) _DOHASH@ib(82,%0)
  358. #define _HASH@ib_S(%0) _DOHASH@ib(83,%0)
  359. #define _HASH@ib_T(%0) _DOHASH@ib(84,%0)
  360. #define _HASH@ib_U(%0) _DOHASH@ib(85,%0)
  361. #define _HASH@ib_V(%0) _DOHASH@ib(86,%0)
  362. #define _HASH@ib_W(%0) _DOHASH@ib(87,%0)
  363. #define _HASH@ib_X(%0) _DOHASH@ib(88,%0)
  364. #define _HASH@ib_Y(%0) _DOHASH@ib(89,%0)
  365. #define _HASH@ib_Z(%0) _DOHASH@ib(90,%0)
  366. // Underscore.
  367. #define _HASH@ib__(%0) _DOHASH@ib(95,%0)
  368. // Lower case letters.
  369. #define _HASH@ib_a(%0) _DOHASH@ib(65,%0)
  370. #define _HASH@ib_b(%0) _DOHASH@ib(66,%0)
  371. #define _HASH@ib_c(%0) _DOHASH@ib(67,%0)
  372. #define _HASH@ib_d(%0) _DOHASH@ib(68,%0)
  373. #define _HASH@ib_e(%0) _DOHASH@ib(69,%0)
  374. #define _HASH@ib_f(%0) _DOHASH@ib(70,%0)
  375. #define _HASH@ib_g(%0) _DOHASH@ib(71,%0)
  376. #define _HASH@ib_h(%0) _DOHASH@ib(72,%0)
  377. #define _HASH@ib_i(%0) _DOHASH@ib(73,%0)
  378. #define _HASH@ib_j(%0) _DOHASH@ib(74,%0)
  379. #define _HASH@ib_k(%0) _DOHASH@ib(75,%0)
  380. #define _HASH@ib_l(%0) _DOHASH@ib(76,%0)
  381. #define _HASH@ib_m(%0) _DOHASH@ib(77,%0)
  382. #define _HASH@ib_n(%0) _DOHASH@ib(78,%0)
  383. #define _HASH@ib_o(%0) _DOHASH@ib(79,%0)
  384. #define _HASH@ib_p(%0) _DOHASH@ib(80,%0)
  385. #define _HASH@ib_q(%0) _DOHASH@ib(81,%0)
  386. #define _HASH@ib_r(%0) _DOHASH@ib(82,%0)
  387. #define _HASH@ib_s(%0) _DOHASH@ib(83,%0)
  388. #define _HASH@ib_t(%0) _DOHASH@ib(84,%0)
  389. #define _HASH@ib_u(%0) _DOHASH@ib(85,%0)
  390. #define _HASH@ib_v(%0) _DOHASH@ib(86,%0)
  391. #define _HASH@ib_w(%0) _DOHASH@ib(87,%0)
  392. #define _HASH@ib_x(%0) _DOHASH@ib(88,%0)
  393. #define _HASH@ib_y(%0) _DOHASH@ib(89,%0)
  394. #define _HASH@ib_z(%0) _DOHASH@ib(90,%0)
  395. // String end.
  396. #define _HASH@ib_@(%0) -1
  397. // ===========
  398. // FNV1 hash
  399. // ===========
  400. // Signify the end with two "@" symbols.
  401. #define HASHi@fnv1(%0) _REHASH@if(%0,@,@)
  402. // Internal call.
  403. #define _REHASH@if(%0,%1) _HASH@if_%0(%1)
  404. // The bit that actually does the work.
  405. #define _DOHASH@if(%0,%1,%2) (_HASH@if_%1(%2)*16777619^%0)
  406. // Space.
  407. #define _HASH@if_(%0) _DOHASH@if(32,%0)
  408. // Numbers.
  409. #define _HASH@if_0(%0) _DOHASH@if(48,%0)
  410. #define _HASH@if_1(%0) _DOHASH@if(49,%0)
  411. #define _HASH@if_2(%0) _DOHASH@if(50,%0)
  412. #define _HASH@if_3(%0) _DOHASH@if(51,%0)
  413. #define _HASH@if_4(%0) _DOHASH@if(52,%0)
  414. #define _HASH@if_5(%0) _DOHASH@if(53,%0)
  415. #define _HASH@if_6(%0) _DOHASH@if(54,%0)
  416. #define _HASH@if_7(%0) _DOHASH@if(55,%0)
  417. #define _HASH@if_8(%0) _DOHASH@if(56,%0)
  418. #define _HASH@if_9(%0) _DOHASH@if(57,%0)
  419. // Upper case letters.
  420. #define _HASH@if_A(%0) _DOHASH@if(65,%0)
  421. #define _HASH@if_B(%0) _DOHASH@if(66,%0)
  422. #define _HASH@if_C(%0) _DOHASH@if(67,%0)
  423. #define _HASH@if_D(%0) _DOHASH@if(68,%0)
  424. #define _HASH@if_E(%0) _DOHASH@if(69,%0)
  425. #define _HASH@if_F(%0) _DOHASH@if(70,%0)
  426. #define _HASH@if_G(%0) _DOHASH@if(71,%0)
  427. #define _HASH@if_H(%0) _DOHASH@if(72,%0)
  428. #define _HASH@if_I(%0) _DOHASH@if(73,%0)
  429. #define _HASH@if_J(%0) _DOHASH@if(74,%0)
  430. #define _HASH@if_K(%0) _DOHASH@if(75,%0)
  431. #define _HASH@if_L(%0) _DOHASH@if(76,%0)
  432. #define _HASH@if_M(%0) _DOHASH@if(77,%0)
  433. #define _HASH@if_N(%0) _DOHASH@if(78,%0)
  434. #define _HASH@if_O(%0) _DOHASH@if(79,%0)
  435. #define _HASH@if_P(%0) _DOHASH@if(80,%0)
  436. #define _HASH@if_Q(%0) _DOHASH@if(81,%0)
  437. #define _HASH@if_R(%0) _DOHASH@if(82,%0)
  438. #define _HASH@if_S(%0) _DOHASH@if(83,%0)
  439. #define _HASH@if_T(%0) _DOHASH@if(84,%0)
  440. #define _HASH@if_U(%0) _DOHASH@if(85,%0)
  441. #define _HASH@if_V(%0) _DOHASH@if(86,%0)
  442. #define _HASH@if_W(%0) _DOHASH@if(87,%0)
  443. #define _HASH@if_X(%0) _DOHASH@if(88,%0)
  444. #define _HASH@if_Y(%0) _DOHASH@if(89,%0)
  445. #define _HASH@if_Z(%0) _DOHASH@if(90,%0)
  446. // Underscore.
  447. #define _HASH@if__(%0) _DOHASH@if(95,%0)
  448. // Lower case letters.
  449. #define _HASH@if_a(%0) _DOHASH@if(65,%0)
  450. #define _HASH@if_b(%0) _DOHASH@if(66,%0)
  451. #define _HASH@if_c(%0) _DOHASH@if(67,%0)
  452. #define _HASH@if_d(%0) _DOHASH@if(68,%0)
  453. #define _HASH@if_e(%0) _DOHASH@if(69,%0)
  454. #define _HASH@if_f(%0) _DOHASH@if(70,%0)
  455. #define _HASH@if_g(%0) _DOHASH@if(71,%0)
  456. #define _HASH@if_h(%0) _DOHASH@if(72,%0)
  457. #define _HASH@if_i(%0) _DOHASH@if(73,%0)
  458. #define _HASH@if_j(%0) _DOHASH@if(74,%0)
  459. #define _HASH@if_k(%0) _DOHASH@if(75,%0)
  460. #define _HASH@if_l(%0) _DOHASH@if(76,%0)
  461. #define _HASH@if_m(%0) _DOHASH@if(77,%0)
  462. #define _HASH@if_n(%0) _DOHASH@if(78,%0)
  463. #define _HASH@if_o(%0) _DOHASH@if(79,%0)
  464. #define _HASH@if_p(%0) _DOHASH@if(80,%0)
  465. #define _HASH@if_q(%0) _DOHASH@if(81,%0)
  466. #define _HASH@if_r(%0) _DOHASH@if(82,%0)
  467. #define _HASH@if_s(%0) _DOHASH@if(83,%0)
  468. #define _HASH@if_t(%0) _DOHASH@if(84,%0)
  469. #define _HASH@if_u(%0) _DOHASH@if(85,%0)
  470. #define _HASH@if_v(%0) _DOHASH@if(86,%0)
  471. #define _HASH@if_w(%0) _DOHASH@if(87,%0)
  472. #define _HASH@if_x(%0) _DOHASH@if(88,%0)
  473. #define _HASH@if_y(%0) _DOHASH@if(89,%0)
  474. #define _HASH@if_z(%0) _DOHASH@if(90,%0)
  475. // String end.
  476. #define _HASH@if_@(%0) 2166136261
  477. // ============
  478. // FNV1a hash
  479. // ============
  480. // Signify the end with two "@" symbols.
  481. #define HASHi@fnv1a(%0) _REHASH@ia(%0,@,@)
  482. // Internal call.
  483. #define _REHASH@ia(%0,%1) _HASH@ia_%0(%1)
  484. // The bit that actually does the work.
  485. #define _DOHASH@ia(%0,%1,%2) ((_HASH@ia_%1(%2)^%0)*16777619)
  486. // Space.
  487. #define _HASH@ia_(%0) _DOHASH@ia(32,%0)
  488. // Numbers.
  489. #define _HASH@ia_0(%0) _DOHASH@ia(48,%0)
  490. #define _HASH@ia_1(%0) _DOHASH@ia(49,%0)
  491. #define _HASH@ia_2(%0) _DOHASH@ia(50,%0)
  492. #define _HASH@ia_3(%0) _DOHASH@ia(51,%0)
  493. #define _HASH@ia_4(%0) _DOHASH@ia(52,%0)
  494. #define _HASH@ia_5(%0) _DOHASH@ia(53,%0)
  495. #define _HASH@ia_6(%0) _DOHASH@ia(54,%0)
  496. #define _HASH@ia_7(%0) _DOHASH@ia(55,%0)
  497. #define _HASH@ia_8(%0) _DOHASH@ia(56,%0)
  498. #define _HASH@ia_9(%0) _DOHASH@ia(57,%0)
  499. // Upper case letters.
  500. #define _HASH@ia_A(%0) _DOHASH@ia(65,%0)
  501. #define _HASH@ia_B(%0) _DOHASH@ia(66,%0)
  502. #define _HASH@ia_C(%0) _DOHASH@ia(67,%0)
  503. #define _HASH@ia_D(%0) _DOHASH@ia(68,%0)
  504. #define _HASH@ia_E(%0) _DOHASH@ia(69,%0)
  505. #define _HASH@ia_F(%0) _DOHASH@ia(70,%0)
  506. #define _HASH@ia_G(%0) _DOHASH@ia(71,%0)
  507. #define _HASH@ia_H(%0) _DOHASH@ia(72,%0)
  508. #define _HASH@ia_I(%0) _DOHASH@ia(73,%0)
  509. #define _HASH@ia_J(%0) _DOHASH@ia(74,%0)
  510. #define _HASH@ia_K(%0) _DOHASH@ia(75,%0)
  511. #define _HASH@ia_L(%0) _DOHASH@ia(76,%0)
  512. #define _HASH@ia_M(%0) _DOHASH@ia(77,%0)
  513. #define _HASH@ia_N(%0) _DOHASH@ia(78,%0)
  514. #define _HASH@ia_O(%0) _DOHASH@ia(79,%0)
  515. #define _HASH@ia_P(%0) _DOHASH@ia(80,%0)
  516. #define _HASH@ia_Q(%0) _DOHASH@ia(81,%0)
  517. #define _HASH@ia_R(%0) _DOHASH@ia(82,%0)
  518. #define _HASH@ia_S(%0) _DOHASH@ia(83,%0)
  519. #define _HASH@ia_T(%0) _DOHASH@ia(84,%0)
  520. #define _HASH@ia_U(%0) _DOHASH@ia(85,%0)
  521. #define _HASH@ia_V(%0) _DOHASH@ia(86,%0)
  522. #define _HASH@ia_W(%0) _DOHASH@ia(87,%0)
  523. #define _HASH@ia_X(%0) _DOHASH@ia(88,%0)
  524. #define _HASH@ia_Y(%0) _DOHASH@ia(89,%0)
  525. #define _HASH@ia_Z(%0) _DOHASH@ia(90,%0)
  526. // Underscore.
  527. #define _HASH@ia__(%0) _DOHASH@ia(95,%0)
  528. // Lower case letters.
  529. #define _HASH@ia_a(%0) _DOHASH@ia(65,%0)
  530. #define _HASH@ia_b(%0) _DOHASH@ia(66,%0)
  531. #define _HASH@ia_c(%0) _DOHASH@ia(67,%0)
  532. #define _HASH@ia_d(%0) _DOHASH@ia(68,%0)
  533. #define _HASH@ia_e(%0) _DOHASH@ia(69,%0)
  534. #define _HASH@ia_f(%0) _DOHASH@ia(70,%0)
  535. #define _HASH@ia_g(%0) _DOHASH@ia(71,%0)
  536. #define _HASH@ia_h(%0) _DOHASH@ia(72,%0)
  537. #define _HASH@ia_i(%0) _DOHASH@ia(73,%0)
  538. #define _HASH@ia_j(%0) _DOHASH@ia(74,%0)
  539. #define _HASH@ia_k(%0) _DOHASH@ia(75,%0)
  540. #define _HASH@ia_l(%0) _DOHASH@ia(76,%0)
  541. #define _HASH@ia_m(%0) _DOHASH@ia(77,%0)
  542. #define _HASH@ia_n(%0) _DOHASH@ia(78,%0)
  543. #define _HASH@ia_o(%0) _DOHASH@ia(79,%0)
  544. #define _HASH@ia_p(%0) _DOHASH@ia(80,%0)
  545. #define _HASH@ia_q(%0) _DOHASH@ia(81,%0)
  546. #define _HASH@ia_r(%0) _DOHASH@ia(82,%0)
  547. #define _HASH@ia_s(%0) _DOHASH@ia(83,%0)
  548. #define _HASH@ia_t(%0) _DOHASH@ia(84,%0)
  549. #define _HASH@ia_u(%0) _DOHASH@ia(85,%0)
  550. #define _HASH@ia_v(%0) _DOHASH@ia(86,%0)
  551. #define _HASH@ia_w(%0) _DOHASH@ia(87,%0)
  552. #define _HASH@ia_x(%0) _DOHASH@ia(88,%0)
  553. #define _HASH@ia_y(%0) _DOHASH@ia(89,%0)
  554. #define _HASH@ia_z(%0) _DOHASH@ia(90,%0)
  555. // String end.
  556. #define _HASH@ia_@(%0) 2166136261
  557. enum e_HASH_TYPE
  558. {
  559. hash_bernstein,
  560. hash_fnv1,
  561. hash_fnv1a
  562. }
  563. /*----------------------------------------------------------------------------*-
  564. Function:
  565. Hash
  566. Params:
  567. str - The string to hash.
  568. sensitive - Wether the hash is case sensitive or not.
  569. Return:
  570. The reverse Bernstein hash of the string.
  571. Notes:
  572. Based on Bernstein hash, but backwards to match the macros. The only
  573. characters which can be used in the compile time version of this code are:
  574. a-z, A-Z, 0-9, _ and space.
  575. native Hash(str[]);
  576. -*----------------------------------------------------------------------------*/
  577. stock YHash(const str[], bool:sensitive = true, e_HASH_TYPE:type = hash_bernstein, len = -1)
  578. {
  579. if (len == -1)
  580. {
  581. len = strlen(str);
  582. }
  583. switch (type)
  584. {
  585. case hash_bernstein:
  586. {
  587. new
  588. hash = -1;
  589. if (sensitive)
  590. {
  591. while (len--)
  592. {
  593. hash = hash * 33 + str[len];
  594. }
  595. }
  596. else
  597. {
  598. while (len--)
  599. {
  600. new
  601. ch = str[len];
  602. if (ch >= 'a' && ch <= 'z')
  603. {
  604. ch &= ~0x20;
  605. }
  606. hash = hash * 33 + ch;
  607. }
  608. }
  609. return hash;
  610. }
  611. case hash_fnv1:
  612. {
  613. new
  614. hash = 2166136261;
  615. if (sensitive)
  616. {
  617. while (len--)
  618. {
  619. hash = hash * 16777619 ^ str[len];
  620. }
  621. }
  622. else
  623. {
  624. while (len--)
  625. {
  626. new
  627. ch = str[len];
  628. if (ch >= 'a' && ch <= 'z')
  629. {
  630. ch &= ~0x20;
  631. }
  632. hash = hash * 16777619 ^ ch;
  633. }
  634. }
  635. return hash;
  636. }
  637. case hash_fnv1a:
  638. {
  639. new
  640. hash = 2166136261;
  641. if (sensitive)
  642. {
  643. while (len--)
  644. {
  645. hash = (hash ^ str[len]) * 16777619;
  646. }
  647. }
  648. else
  649. {
  650. while (len--)
  651. {
  652. new
  653. ch = str[len];
  654. if (ch >= 'a' && ch <= 'z')
  655. {
  656. ch &= ~0x20;
  657. }
  658. hash = (hash ^ ch) * 16777619;
  659. }
  660. }
  661. return hash;
  662. }
  663. }
  664. return -1;
  665. }