Annotation of 43BSD/contrib/icon/rt/hash.c, revision 1.1.1.1

1.1       root        1: #include "../h/rt.h"
                      2: 
                      3: /*
                      4:  * hash - compute hash value of arbitrary object for table and set accessing.
                      5:  */
                      6: 
                      7: hash(d)
                      8: struct descrip *d;
                      9:    {
                     10:    register int i, j;
                     11:    register char *s;
                     12: 
                     13:    if (QUAL(*d)) {
                     14:       /*
                     15:        * Compute the hash value for the string by summing the value
                     16:        *  of all the characters (up to a maximum of 10) plus the length.
                     17:        */
                     18:       i = 0;
                     19:       s = STRLOC(*d);
                     20:       j = STRLEN(*d);
                     21:       for (j = (j <= 10) ? j : 10 ; j > 0; j--)
                     22:          i += *s++ & 0377;
                     23:       i += STRLEN(*d) & 0377;
                     24:       }
                     25:    else {
                     26:       switch (TYPE(*d)) {
                     27:          /*
                     28:           * The hash value for numeric types is the bitstring representation
                     29:           *  of the value.
                     30:           */
                     31:          case T_INTEGER:
                     32:             i = INTVAL(*d);
                     33:             break;
                     34: 
                     35: #ifdef LONGS
                     36:          case T_LONGINT:
                     37:             i = BLKLOC(*d)->longint.intval;
                     38:             break;
                     39: 
                     40: #endif LONGS
                     41:          case T_REAL:
                     42:             i = BLKLOC(*d)->realblk.realval;
                     43:             break;
                     44: 
                     45:          case T_CSET:
                     46:             /*
                     47:              * Compute the hash value for a cset by exclusive or-ing the
                     48:              *  words in the bit array.
                     49:              */
                     50:             i = 0;
                     51:             for (j = 0; j < CSETSIZE; j++)
                     52:                i ^= BLKLOC(*d)->cset.bits[j];
                     53:             break;
                     54: 
                     55:          default:
                     56:             /*
                     57:              * For other types, just use the type value as the hash
                     58:              *  value.  This produces loads of collisions, but that's
                     59:              *  why collision insurance is mandatory.
                     60:              */
                     61:             i = TYPE(*d);
                     62:             break;
                     63:          }
                     64:       }
                     65:    /*
                     66:     * Return the hash value as a positive number.
                     67:     */
                     68:    return ((unsigned)i);
                     69:    }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.