00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifdef HAVE_CONFIG_H
00036 #include "config.h"
00037 #endif
00038
00039 #include <sys/types.h>
00040
00041 #ifdef HAVE_STDLIB_H
00042 #include <stdlib.h>
00043 #endif
00044 #ifdef HAVE_STRING_H
00045 #include <string.h>
00046 #endif
00047 #ifdef HAVE_MALLOC_H
00048 #include <malloc.h>
00049 #endif
00050 #ifdef HAVE_LIMITS_H
00051 #include <limits.h>
00052 #endif
00053 #ifdef HAVE_STDINT_H
00054 #include <stdint.h>
00055 #endif
00056
00057 #include <stdio.h>
00058
00059 #include "libiberty.h"
00060 #include "ansidecl.h"
00061 #include "hashtab.h"
00062
00063 #ifndef CHAR_BIT
00064 #define CHAR_BIT 8
00065 #endif
00066
00067 static unsigned int higher_prime_index (unsigned long);
00068 static hashval_t htab_mod_1 (hashval_t, hashval_t, hashval_t, int);
00069 static hashval_t htab_mod (hashval_t, htab_t);
00070 static hashval_t htab_mod_m2 (hashval_t, htab_t);
00071 static hashval_t hash_pointer (const void *);
00072 static int eq_pointer (const void *, const void *);
00073 static int htab_expand (htab_t);
00074 static PTR *find_empty_slot_for_expand (htab_t, hashval_t);
00075
00076
00077
00078
00079 htab_hash htab_hash_pointer = hash_pointer;
00080 htab_eq htab_eq_pointer = eq_pointer;
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 #if 0
00092 unsigned int
00093 ceil_log2 (unsigned int x)
00094 {
00095 int i;
00096 for (i = 31; i >= 0 ; --i)
00097 if (x > (1u << i))
00098 return i+1;
00099 abort ();
00100 }
00101
00102 unsigned int
00103 choose_multiplier (unsigned int d, unsigned int *mlp, unsigned char *shiftp)
00104 {
00105 unsigned long long mhigh;
00106 double nx;
00107 int lgup, post_shift;
00108 int pow, pow2;
00109 int n = 32, precision = 32;
00110
00111 lgup = ceil_log2 (d);
00112 pow = n + lgup;
00113 pow2 = n + lgup - precision;
00114
00115 nx = ldexp (1.0, pow) + ldexp (1.0, pow2);
00116 mhigh = nx / d;
00117
00118 *shiftp = lgup - 1;
00119 *mlp = mhigh;
00120 return mhigh >> 32;
00121 }
00122 #endif
00123
00124 struct prime_ent
00125 {
00126 hashval_t prime;
00127 hashval_t inv;
00128 hashval_t inv_m2;
00129 hashval_t shift;
00130 };
00131
00132 static struct prime_ent const prime_tab[] = {
00133 { 7, 0x24924925, 0x9999999b, 2 },
00134 { 13, 0x3b13b13c, 0x745d1747, 3 },
00135 { 31, 0x08421085, 0x1a7b9612, 4 },
00136 { 61, 0x0c9714fc, 0x15b1e5f8, 5 },
00137 { 127, 0x02040811, 0x0624dd30, 6 },
00138 { 251, 0x05197f7e, 0x073260a5, 7 },
00139 { 509, 0x01824366, 0x02864fc8, 8 },
00140 { 1021, 0x00c0906d, 0x014191f7, 9 },
00141 { 2039, 0x0121456f, 0x0161e69e, 10 },
00142 { 4093, 0x00300902, 0x00501908, 11 },
00143 { 8191, 0x00080041, 0x00180241, 12 },
00144 { 16381, 0x000c0091, 0x00140191, 13 },
00145 { 32749, 0x002605a5, 0x002a06e6, 14 },
00146 { 65521, 0x000f00e2, 0x00110122, 15 },
00147 { 131071, 0x00008001, 0x00018003, 16 },
00148 { 262139, 0x00014002, 0x0001c004, 17 },
00149 { 524287, 0x00002001, 0x00006001, 18 },
00150 { 1048573, 0x00003001, 0x00005001, 19 },
00151 { 2097143, 0x00004801, 0x00005801, 20 },
00152 { 4194301, 0x00000c01, 0x00001401, 21 },
00153 { 8388593, 0x00001e01, 0x00002201, 22 },
00154 { 16777213, 0x00000301, 0x00000501, 23 },
00155 { 33554393, 0x00001381, 0x00001481, 24 },
00156 { 67108859, 0x00000141, 0x000001c1, 25 },
00157 { 134217689, 0x000004e1, 0x00000521, 26 },
00158 { 268435399, 0x00000391, 0x000003b1, 27 },
00159 { 536870909, 0x00000019, 0x00000029, 28 },
00160 { 1073741789, 0x0000008d, 0x00000095, 29 },
00161 { 2147483647, 0x00000003, 0x00000007, 30 },
00162
00163 { 0xfffffffb, 0x00000006, 0x00000008, 31 }
00164 };
00165
00166
00167
00168
00169 static unsigned int
00170 higher_prime_index (unsigned long n)
00171 {
00172 unsigned int low = 0;
00173 unsigned int high = sizeof(prime_tab) / sizeof(prime_tab[0]);
00174
00175 while (low != high)
00176 {
00177 unsigned int mid = low + (high - low) / 2;
00178 if (n > prime_tab[mid].prime)
00179 low = mid + 1;
00180 else
00181 high = mid;
00182 }
00183
00184
00185 if (n > prime_tab[low].prime)
00186 {
00187 fprintf (stderr, "Cannot find prime bigger than %lu\n", n);
00188 abort ();
00189 }
00190
00191 return low;
00192 }
00193
00194
00195
00196 static hashval_t
00197 hash_pointer (const PTR p)
00198 {
00199 return (hashval_t) ((long)p >> 3);
00200 }
00201
00202
00203
00204 static int
00205 eq_pointer (const PTR p1, const PTR p2)
00206 {
00207 return p1 == p2;
00208 }
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 #define htab_size(htab) ((htab)->size)
00219
00220 size_t
00221 (htab_size) (htab_t htab)
00222 {
00223 return htab_size (htab);
00224 }
00225
00226
00227
00228 #define htab_elements(htab) ((htab)->n_elements - (htab)->n_deleted)
00229
00230 size_t
00231 (htab_elements) (htab_t htab)
00232 {
00233 return htab_elements (htab);
00234 }
00235
00236
00237
00238 static inline hashval_t
00239 htab_mod_1 (hashval_t x, hashval_t y, hashval_t inv, int shift)
00240 {
00241
00242
00243 #ifdef UNSIGNED_64BIT_TYPE
00244 __extension__ typedef UNSIGNED_64BIT_TYPE ull;
00245 if (sizeof (hashval_t) * CHAR_BIT <= 32)
00246 {
00247 hashval_t t1, t2, t3, t4, q, r;
00248
00249 t1 = ((ull)x * inv) >> 32;
00250 t2 = x - t1;
00251 t3 = t2 >> 1;
00252 t4 = t1 + t3;
00253 q = t4 >> shift;
00254 r = x - (q * y);
00255
00256 return r;
00257 }
00258 #endif
00259
00260
00261 return x % y;
00262 }
00263
00264
00265
00266 static inline hashval_t
00267 htab_mod (hashval_t hash, htab_t htab)
00268 {
00269 const struct prime_ent *p = &prime_tab[htab->size_prime_index];
00270 return htab_mod_1 (hash, p->prime, p->inv, p->shift);
00271 }
00272
00273
00274
00275 static inline hashval_t
00276 htab_mod_m2 (hashval_t hash, htab_t htab)
00277 {
00278 const struct prime_ent *p = &prime_tab[htab->size_prime_index];
00279 return 1 + htab_mod_1 (hash, p->prime - 2, p->inv_m2, p->shift);
00280 }
00281
00282
00283
00284
00285
00286
00287 htab_t
00288 htab_create_alloc (size_t size, htab_hash hash_f, htab_eq eq_f,
00289 htab_del del_f, htab_alloc alloc_f, htab_free free_f)
00290 {
00291 htab_t result;
00292 unsigned int size_prime_index;
00293
00294 size_prime_index = higher_prime_index (size);
00295 size = prime_tab[size_prime_index].prime;
00296
00297 result = (htab_t) (*alloc_f) (1, sizeof (struct htab));
00298 if (result == NULL)
00299 return NULL;
00300 result->entries = (PTR *) (*alloc_f) (size, sizeof (PTR));
00301 if (result->entries == NULL)
00302 {
00303 if (free_f != NULL)
00304 (*free_f) (result);
00305 return NULL;
00306 }
00307 result->size = size;
00308 result->size_prime_index = size_prime_index;
00309 result->hash_f = hash_f;
00310 result->eq_f = eq_f;
00311 result->del_f = del_f;
00312 result->alloc_f = alloc_f;
00313 result->free_f = free_f;
00314 return result;
00315 }
00316
00317
00318
00319
00320 htab_t
00321 htab_create_alloc_ex (size_t size, htab_hash hash_f, htab_eq eq_f,
00322 htab_del del_f, void *alloc_arg,
00323 htab_alloc_with_arg alloc_f,
00324 htab_free_with_arg free_f)
00325 {
00326 htab_t result;
00327 unsigned int size_prime_index;
00328
00329 size_prime_index = higher_prime_index (size);
00330 size = prime_tab[size_prime_index].prime;
00331
00332 result = (htab_t) (*alloc_f) (alloc_arg, 1, sizeof (struct htab));
00333 if (result == NULL)
00334 return NULL;
00335 result->entries = (PTR *) (*alloc_f) (alloc_arg, size, sizeof (PTR));
00336 if (result->entries == NULL)
00337 {
00338 if (free_f != NULL)
00339 (*free_f) (alloc_arg, result);
00340 return NULL;
00341 }
00342 result->size = size;
00343 result->size_prime_index = size_prime_index;
00344 result->hash_f = hash_f;
00345 result->eq_f = eq_f;
00346 result->del_f = del_f;
00347 result->alloc_arg = alloc_arg;
00348 result->alloc_with_arg_f = alloc_f;
00349 result->free_with_arg_f = free_f;
00350 return result;
00351 }
00352
00353
00354
00355 void
00356 htab_set_functions_ex (htab_t htab, htab_hash hash_f, htab_eq eq_f,
00357 htab_del del_f, PTR alloc_arg,
00358 htab_alloc_with_arg alloc_f, htab_free_with_arg free_f)
00359 {
00360 htab->hash_f = hash_f;
00361 htab->eq_f = eq_f;
00362 htab->del_f = del_f;
00363 htab->alloc_arg = alloc_arg;
00364 htab->alloc_with_arg_f = alloc_f;
00365 htab->free_with_arg_f = free_f;
00366 }
00367
00368
00369
00370 #undef htab_create
00371 htab_t
00372 htab_create (size_t size, htab_hash hash_f, htab_eq eq_f, htab_del del_f)
00373 {
00374 return htab_create_alloc (size, hash_f, eq_f, del_f, xcalloc, free);
00375 }
00376
00377 htab_t
00378 htab_try_create (size_t size, htab_hash hash_f, htab_eq eq_f, htab_del del_f)
00379 {
00380 return htab_create_alloc (size, hash_f, eq_f, del_f, calloc, free);
00381 }
00382
00383
00384
00385
00386 void
00387 htab_delete (htab_t htab)
00388 {
00389 size_t size = htab_size (htab);
00390 PTR *entries = htab->entries;
00391 int i;
00392
00393 if (htab->del_f)
00394 for (i = size - 1; i >= 0; i--)
00395 if (entries[i] != HTAB_EMPTY_ENTRY && entries[i] != HTAB_DELETED_ENTRY)
00396 (*htab->del_f) (entries[i]);
00397
00398 if (htab->free_f != NULL)
00399 {
00400 (*htab->free_f) (entries);
00401 (*htab->free_f) (htab);
00402 }
00403 else if (htab->free_with_arg_f != NULL)
00404 {
00405 (*htab->free_with_arg_f) (htab->alloc_arg, entries);
00406 (*htab->free_with_arg_f) (htab->alloc_arg, htab);
00407 }
00408 }
00409
00410
00411
00412 void
00413 htab_empty (htab_t htab)
00414 {
00415 size_t size = htab_size (htab);
00416 PTR *entries = htab->entries;
00417 int i;
00418
00419 if (htab->del_f)
00420 for (i = size - 1; i >= 0; i--)
00421 if (entries[i] != HTAB_EMPTY_ENTRY && entries[i] != HTAB_DELETED_ENTRY)
00422 (*htab->del_f) (entries[i]);
00423
00424
00425 if (size > 1024*1024 / sizeof (PTR))
00426 {
00427 int nindex = higher_prime_index (1024 / sizeof (PTR));
00428 int nsize = prime_tab[nindex].prime;
00429
00430 if (htab->free_f != NULL)
00431 (*htab->free_f) (htab->entries);
00432 else if (htab->free_with_arg_f != NULL)
00433 (*htab->free_with_arg_f) (htab->alloc_arg, htab->entries);
00434 if (htab->alloc_with_arg_f != NULL)
00435 htab->entries = (PTR *) (*htab->alloc_with_arg_f) (htab->alloc_arg, nsize,
00436 sizeof (PTR *));
00437 else
00438 htab->entries = (PTR *) (*htab->alloc_f) (nsize, sizeof (PTR *));
00439 htab->size = nsize;
00440 htab->size_prime_index = nindex;
00441 }
00442 else
00443 memset (entries, 0, size * sizeof (PTR));
00444 htab->n_deleted = 0;
00445 htab->n_elements = 0;
00446 }
00447
00448
00449
00450
00451
00452
00453
00454
00455 static PTR *
00456 find_empty_slot_for_expand (htab_t htab, hashval_t hash)
00457 {
00458 hashval_t index = htab_mod (hash, htab);
00459 size_t size = htab_size (htab);
00460 PTR *slot = htab->entries + index;
00461 hashval_t hash2;
00462
00463 if (*slot == HTAB_EMPTY_ENTRY)
00464 return slot;
00465 else if (*slot == HTAB_DELETED_ENTRY)
00466 abort ();
00467
00468 hash2 = htab_mod_m2 (hash, htab);
00469 for (;;)
00470 {
00471 index += hash2;
00472 if (index >= size)
00473 index -= size;
00474
00475 slot = htab->entries + index;
00476 if (*slot == HTAB_EMPTY_ENTRY)
00477 return slot;
00478 else if (*slot == HTAB_DELETED_ENTRY)
00479 abort ();
00480 }
00481 }
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491 static int
00492 htab_expand (htab_t htab)
00493 {
00494 PTR *oentries;
00495 PTR *olimit;
00496 PTR *p;
00497 PTR *nentries;
00498 size_t nsize, osize, elts;
00499 unsigned int oindex, nindex;
00500
00501 oentries = htab->entries;
00502 oindex = htab->size_prime_index;
00503 osize = htab->size;
00504 olimit = oentries + osize;
00505 elts = htab_elements (htab);
00506
00507
00508
00509 if (elts * 2 > osize || (elts * 8 < osize && osize > 32))
00510 {
00511 nindex = higher_prime_index (elts * 2);
00512 nsize = prime_tab[nindex].prime;
00513 }
00514 else
00515 {
00516 nindex = oindex;
00517 nsize = osize;
00518 }
00519
00520 if (htab->alloc_with_arg_f != NULL)
00521 nentries = (PTR *) (*htab->alloc_with_arg_f) (htab->alloc_arg, nsize,
00522 sizeof (PTR *));
00523 else
00524 nentries = (PTR *) (*htab->alloc_f) (nsize, sizeof (PTR *));
00525 if (nentries == NULL)
00526 return 0;
00527 htab->entries = nentries;
00528 htab->size = nsize;
00529 htab->size_prime_index = nindex;
00530 htab->n_elements -= htab->n_deleted;
00531 htab->n_deleted = 0;
00532
00533 p = oentries;
00534 do
00535 {
00536 PTR x = *p;
00537
00538 if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY)
00539 {
00540 PTR *q = find_empty_slot_for_expand (htab, (*htab->hash_f) (x));
00541
00542 *q = x;
00543 }
00544
00545 p++;
00546 }
00547 while (p < olimit);
00548
00549 if (htab->free_f != NULL)
00550 (*htab->free_f) (oentries);
00551 else if (htab->free_with_arg_f != NULL)
00552 (*htab->free_with_arg_f) (htab->alloc_arg, oentries);
00553 return 1;
00554 }
00555
00556
00557
00558
00559 PTR
00560 htab_find_with_hash (htab_t htab, const PTR element, hashval_t hash)
00561 {
00562 hashval_t index, hash2;
00563 size_t size;
00564 PTR entry;
00565
00566 htab->searches++;
00567 size = htab_size (htab);
00568 index = htab_mod (hash, htab);
00569
00570 entry = htab->entries[index];
00571 if (entry == HTAB_EMPTY_ENTRY
00572 || (entry != HTAB_DELETED_ENTRY && (*htab->eq_f) (entry, element)))
00573 return entry;
00574
00575 hash2 = htab_mod_m2 (hash, htab);
00576 for (;;)
00577 {
00578 htab->collisions++;
00579 index += hash2;
00580 if (index >= size)
00581 index -= size;
00582
00583 entry = htab->entries[index];
00584 if (entry == HTAB_EMPTY_ENTRY
00585 || (entry != HTAB_DELETED_ENTRY && (*htab->eq_f) (entry, element)))
00586 return entry;
00587 }
00588 }
00589
00590
00591
00592
00593 PTR
00594 htab_find (htab_t htab, const PTR element)
00595 {
00596 return htab_find_with_hash (htab, element, (*htab->hash_f) (element));
00597 }
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607 PTR *
00608 htab_find_slot_with_hash (htab_t htab, const PTR element,
00609 hashval_t hash, enum insert_option insert)
00610 {
00611 PTR *first_deleted_slot;
00612 hashval_t index, hash2;
00613 size_t size;
00614 PTR entry;
00615
00616 size = htab_size (htab);
00617 if (insert == INSERT && size * 3 <= htab->n_elements * 4)
00618 {
00619 if (htab_expand (htab) == 0)
00620 return NULL;
00621 size = htab_size (htab);
00622 }
00623
00624 index = htab_mod (hash, htab);
00625
00626 htab->searches++;
00627 first_deleted_slot = NULL;
00628
00629 entry = htab->entries[index];
00630 if (entry == HTAB_EMPTY_ENTRY)
00631 goto empty_entry;
00632 else if (entry == HTAB_DELETED_ENTRY)
00633 first_deleted_slot = &htab->entries[index];
00634 else if ((*htab->eq_f) (entry, element))
00635 return &htab->entries[index];
00636
00637 hash2 = htab_mod_m2 (hash, htab);
00638 for (;;)
00639 {
00640 htab->collisions++;
00641 index += hash2;
00642 if (index >= size)
00643 index -= size;
00644
00645 entry = htab->entries[index];
00646 if (entry == HTAB_EMPTY_ENTRY)
00647 goto empty_entry;
00648 else if (entry == HTAB_DELETED_ENTRY)
00649 {
00650 if (!first_deleted_slot)
00651 first_deleted_slot = &htab->entries[index];
00652 }
00653 else if ((*htab->eq_f) (entry, element))
00654 return &htab->entries[index];
00655 }
00656
00657 empty_entry:
00658 if (insert == NO_INSERT)
00659 return NULL;
00660
00661 if (first_deleted_slot)
00662 {
00663 htab->n_deleted--;
00664 *first_deleted_slot = HTAB_EMPTY_ENTRY;
00665 return first_deleted_slot;
00666 }
00667
00668 htab->n_elements++;
00669 return &htab->entries[index];
00670 }
00671
00672
00673
00674
00675 PTR *
00676 htab_find_slot (htab_t htab, const PTR element, enum insert_option insert)
00677 {
00678 return htab_find_slot_with_hash (htab, element, (*htab->hash_f) (element),
00679 insert);
00680 }
00681
00682
00683
00684
00685
00686 void
00687 htab_remove_elt (htab_t htab, PTR element)
00688 {
00689 htab_remove_elt_with_hash (htab, element, (*htab->hash_f) (element));
00690 }
00691
00692
00693
00694
00695
00696
00697 void
00698 htab_remove_elt_with_hash (htab_t htab, PTR element, hashval_t hash)
00699 {
00700 PTR *slot;
00701
00702 slot = htab_find_slot_with_hash (htab, element, hash, NO_INSERT);
00703 if (*slot == HTAB_EMPTY_ENTRY)
00704 return;
00705
00706 if (htab->del_f)
00707 (*htab->del_f) (*slot);
00708
00709 *slot = HTAB_DELETED_ENTRY;
00710 htab->n_deleted++;
00711 }
00712
00713
00714
00715
00716
00717 void
00718 htab_clear_slot (htab_t htab, PTR *slot)
00719 {
00720 if (slot < htab->entries || slot >= htab->entries + htab_size (htab)
00721 || *slot == HTAB_EMPTY_ENTRY || *slot == HTAB_DELETED_ENTRY)
00722 abort ();
00723
00724 if (htab->del_f)
00725 (*htab->del_f) (*slot);
00726
00727 *slot = HTAB_DELETED_ENTRY;
00728 htab->n_deleted++;
00729 }
00730
00731
00732
00733
00734
00735
00736 void
00737 htab_traverse_noresize (htab_t htab, htab_trav callback, PTR info)
00738 {
00739 PTR *slot;
00740 PTR *limit;
00741
00742 slot = htab->entries;
00743 limit = slot + htab_size (htab);
00744
00745 do
00746 {
00747 PTR x = *slot;
00748
00749 if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY)
00750 if (!(*callback) (slot, info))
00751 break;
00752 }
00753 while (++slot < limit);
00754 }
00755
00756
00757
00758
00759 void
00760 htab_traverse (htab_t htab, htab_trav callback, PTR info)
00761 {
00762 if (htab_elements (htab) * 8 < htab_size (htab))
00763 htab_expand (htab);
00764
00765 htab_traverse_noresize (htab, callback, info);
00766 }
00767
00768
00769
00770
00771 double
00772 htab_collisions (htab_t htab)
00773 {
00774 if (htab->searches == 0)
00775 return 0.0;
00776
00777 return (double) htab->collisions / (double) htab->searches;
00778 }
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805 hashval_t
00806 htab_hash_string (const PTR p)
00807 {
00808 const unsigned char *str = (const unsigned char *) p;
00809 hashval_t r = 0;
00810 unsigned char c;
00811
00812 while ((c = *str++) != 0)
00813 r = r * 67 + c - 113;
00814
00815 return r;
00816 }
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854 #define mix(a,b,c) \
00855 { \
00856 a -= b; a -= c; a ^= (c>>13); \
00857 b -= c; b -= a; b ^= (a<< 8); \
00858 c -= a; c -= b; c ^= ((b&0xffffffff)>>13); \
00859 a -= b; a -= c; a ^= ((c&0xffffffff)>>12); \
00860 b -= c; b -= a; b = (b ^ (a<<16)) & 0xffffffff; \
00861 c -= a; c -= b; c = (c ^ (b>> 5)) & 0xffffffff; \
00862 a -= b; a -= c; a = (a ^ (c>> 3)) & 0xffffffff; \
00863 b -= c; b -= a; b = (b ^ (a<<10)) & 0xffffffff; \
00864 c -= a; c -= b; c = (c ^ (b>>15)) & 0xffffffff; \
00865 }
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895 hashval_t
00896 iterative_hash (const PTR k_in ,
00897 register size_t length ,
00898 register hashval_t initval
00899 )
00900 {
00901 register const unsigned char *k = (const unsigned char *)k_in;
00902 register hashval_t a,b,c,len;
00903
00904
00905 len = length;
00906 a = b = 0x9e3779b9;
00907 c = initval;
00908
00909
00910 #ifndef WORDS_BIGENDIAN
00911
00912
00913
00914 if (sizeof (hashval_t) == 4 && (((size_t)k)&3) == 0)
00915 while (len >= 12)
00916 {
00917 a += *(hashval_t *)(k+0);
00918 b += *(hashval_t *)(k+4);
00919 c += *(hashval_t *)(k+8);
00920 mix(a,b,c);
00921 k += 12; len -= 12;
00922 }
00923 else
00924 #endif
00925 while (len >= 12)
00926 {
00927 a += (k[0] +((hashval_t)k[1]<<8) +((hashval_t)k[2]<<16) +((hashval_t)k[3]<<24));
00928 b += (k[4] +((hashval_t)k[5]<<8) +((hashval_t)k[6]<<16) +((hashval_t)k[7]<<24));
00929 c += (k[8] +((hashval_t)k[9]<<8) +((hashval_t)k[10]<<16)+((hashval_t)k[11]<<24));
00930 mix(a,b,c);
00931 k += 12; len -= 12;
00932 }
00933
00934
00935 c += length;
00936 switch(len)
00937 {
00938 case 11: c+=((hashval_t)k[10]<<24);
00939 case 10: c+=((hashval_t)k[9]<<16);
00940 case 9 : c+=((hashval_t)k[8]<<8);
00941
00942 case 8 : b+=((hashval_t)k[7]<<24);
00943 case 7 : b+=((hashval_t)k[6]<<16);
00944 case 6 : b+=((hashval_t)k[5]<<8);
00945 case 5 : b+=k[4];
00946 case 4 : a+=((hashval_t)k[3]<<24);
00947 case 3 : a+=((hashval_t)k[2]<<16);
00948 case 2 : a+=((hashval_t)k[1]<<8);
00949 case 1 : a+=k[0];
00950
00951 }
00952 mix(a,b,c);
00953
00954 return c;
00955 }