Annotation of researchv10no/cmd/odist/pax/man/man3/hash.3, revision 1.1.1.1

1.1       root        1: .de L          \" literal font
                      2: .ft 5
                      3: .it 1 }N
                      4: .if !\\$1 \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6
                      5: ..
                      6: .de LR
                      7: .}S 5 1 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
                      8: ..
                      9: .de RL
                     10: .}S 1 5 \& "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6"
                     11: ..
                     12: .de EX         \" start example
                     13: .ta 1i 2i 3i 4i 5i 6i
                     14: .PP
                     15: .RS 
                     16: .PD 0
                     17: .ft 5
                     18: .nf
                     19: ..
                     20: .de EE         \" end example
                     21: .fi
                     22: .ft
                     23: .PD
                     24: .RE
                     25: .PP
                     26: ..
                     27: .TH HASH 3
                     28: .SH NAME
                     29: hash \- hash table support
                     30: .SH SYNOPSIS
                     31: .L "#include <hash.h>"
                     32: .SH DESCRIPTION
                     33: The
                     34: .I hash
                     35: routines manipulate collections of dynamic, scoped hash tables.
                     36: .PP
                     37: A hash table provides an association between a
                     38: .I key
                     39: and its
                     40: .IR value .
                     41: A
                     42: .I key
                     43: is a sequence of 
                     44: .L char
                     45: elements and a
                     46: .I value
                     47: is a user supplied pointer to the value.
                     48: Each hash table has a dynamic number of slots,
                     49: each pointing to the head of a forward linked
                     50: .IR "collision chain" .
                     51: .PP
                     52: Hashing occurs as follows:
                     53: a
                     54: .I "hash function"
                     55: takes a
                     56: .I key
                     57: as an argument and returns a non-negative index.
                     58: The index modulo the table size produces a
                     59: slot that points to a
                     60: .IR "collision chain" .
                     61: The collision chain is sequentially searched until a match is found for
                     62: .IR key .
                     63: The hash tables are automatically resized as new entries are added.
                     64: .PP
                     65: Each hash table has one key type.
                     66: The default key type is a pointer to a null-terminated string.
                     67: The alternate key type is a pointer to a fixed length byte buffer,
                     68: declared for a given table by the
                     69: .L hashalloc()
                     70: function described below.
                     71: .PP
                     72: Hash table information is partitioned into two parts for efficient scoping.
                     73: The
                     74: .I root
                     75: part contains fixed information that is shared among a set of related
                     76: hash tables.
                     77: The remaining information is maintained on a per-table basis.
                     78: .PP
                     79: These basic types are defined in the header file
                     80: .B hash.h
                     81: (alternate names are listed in parenthesis):
                     82: .TP
                     83: .L "HASHTABLE (Hashtab_t)"
                     84: The per-table information.
                     85: The readonly public elements are:
                     86: .RS
                     87: .TP
                     88: .L "int buckets"
                     89: The number of table entries.
                     90: .TP
                     91: .L "char* name"
                     92: The hash table name.
                     93: .TP
                     94: .L "root"
                     95: The root information.
                     96: The public elements are:
                     97: .RS
                     98: .TP
                     99: .L "int root->accesses"
                    100: The number of lookups.
                    101: .TP
                    102: .L "int root->collisions"
                    103: The number of lookup collisions.
                    104: .RE
                    105: .TP
                    106: .L "HASHTABLE* scope"
                    107: The table that this scope covers, 
                    108: .L NULL
                    109: if the table is not a scope.
                    110: .TP
                    111: .L "int size"
                    112: The current hash table size.
                    113: .RE
                    114: .TP
                    115: .L "HASHBUCKET (Hashbin_t)"
                    116: A collision chain hash bucket.
                    117: The public structure elements are:
                    118: .RS
                    119: .TP
                    120: .L "char* hashname(HASHBUCKET*)"
                    121: Returns a pointer to the hash bucket key given the bucket pointer.
                    122: .TP
                    123: .L "char* value"
                    124: The value associated with the key.
                    125: .RE
                    126: .TP
                    127: .L "HASHHEADER (Hashhdr_t)"
                    128: The hash bucket header that must be the first element in all user defined
                    129: buckets.
                    130: .L HASH_VALUE
                    131: may not be used with user defined buckets.
                    132: .TP
                    133: .L "HASHPOSITION (Hashpos_t)"
                    134: Stores the hash table position for
                    135: .LR hashscan .
                    136: The public elements are:
                    137: .RS
                    138: .TP
                    139: .L "HASHBUCKET* bucket"
                    140: The current hash bucket pointer.
                    141: .RE
                    142: .PP
                    143: The routines are:
                    144: .TP
                    145: .L "HASHTABLE* hashalloc(HASHTABLE* ref, int op, ...)"
                    146: Creates a new hash table and returns a pointer to the table.
                    147: .IR malloc (3)
                    148: is used to allocate space for the table.
                    149: .L NULL
                    150: is returned if the table cannot be created.
                    151: .L ref
                    152: is a pointer to a reference hash table that provides
                    153: default values for unspecified information.
                    154: The new hash table and
                    155: .L ref
                    156: share the same root information.
                    157: If
                    158: .L ref
                    159: is
                    160: .L NULL
                    161: then new root information is created for the new table.
                    162: The remaining arguments appear in
                    163: .I op-arg
                    164: pairs, followed by a final
                    165: .L 0
                    166: argument.
                    167: The
                    168: .I op-arg
                    169: pairs are:
                    170: .RS
                    171: .TP
                    172: .L "HASH_alloc, (char(*)()) alloc"
                    173: .L alloc
                    174: is a function that is called to process
                    175: .L HASHBUCKET
                    176: .L value
                    177: assignments.
                    178: The single argument is
                    179: .L "char* value"
                    180: and the processed
                    181: .L char*
                    182: value is returned.
                    183: .TP
                    184: .L "HASH_clear, int flags"
                    185: .L flags
                    186: are the
                    187: .L ref
                    188: flags to be cleared in the new hash table.
                    189: See
                    190: .L HASH_set
                    191: below.
                    192: .TP
                    193: .L "HASH_compare, (int(*)()) compare"
                    194: Specifies an alternate
                    195: .I key
                    196: comparison function.
                    197: The arguments and return value for
                    198: .L compare
                    199: are the same as for
                    200: .IR strncmp (3)
                    201: if
                    202: .L HASH_namesize
                    203: is specified and
                    204: .IR strcmp (3)
                    205: otherwise.
                    206: The first argument is the 
                    207: .I key
                    208: from the current hash bucket on the 
                    209: .I "collision chain"
                    210: and the second argument is the user supplied 
                    211: .IR key .
                    212: .TP
                    213: .L "HASH_free, (int(*)()) free"
                    214: .L free
                    215: is a function that is called when a hash bucket is freed.
                    216: If
                    217: .L HASH_BUCKET
                    218: was set in
                    219: .L hashalloc
                    220: then the hash bucket pointer is passed, otherwise the bucket
                    221: .L value 
                    222: pointer is passed.
                    223: .TP
                    224: .L "HASH_hash, (int(*)()) hash"
                    225: Specifies an alternate
                    226: .I key
                    227: hash function.
                    228: A
                    229: .L char*
                    230: key argument (and, if
                    231: .L HASH_namesize
                    232: is specified, an
                    233: .L int
                    234: key size argument) is passed to
                    235: .LR hash .
                    236: The return value must be a non-negative
                    237: .LR int .
                    238: .TP
                    239: .L "HASH_meanchain, int meanchain"
                    240: Specifies the mean collision chain length.
                    241: The hash table is automatically resized when this value is exceeded.
                    242: The default mean chain length is 2.
                    243: .TP
                    244: .L "HASH_name, char* name"
                    245: Associates
                    246: .L name
                    247: with the hash table.
                    248: Used by
                    249: .LR hashdump) .
                    250: .TP
                    251: .L "HASH_namesize, int namesize"
                    252: The fixed size in bytes for
                    253: .I keys
                    254: in the table.
                    255: If
                    256: .L namesize
                    257: is 0 (the default) then the
                    258: .I keys
                    259: are interpreted as null-terminated strings.
                    260: .TP
                    261: .L "HASH_set, int flags"
                    262: Changes the hash table flags by
                    263: .IR or ing
                    264: in
                    265: .LR flags .
                    266: The flags, which may be 
                    267: .IR or ed
                    268: together, are:
                    269: .RS
                    270: .TP
                    271: .L HASH_ALLOCATE
                    272: Keys for new hash table entries are to be copied to data areas obtained from
                    273: .IR malloc (3).
                    274: .TP
                    275: .L HASH_FIXED
                    276: Fixes the hash table size, disabling any automatic table resizing.
                    277: .TP
                    278: .L HASH_SCOPE
                    279: The new hash table is a scope that is to be pushed on top of
                    280: .LR ref .
                    281: .L ref
                    282: must be
                    283: .RL non- NULL .
                    284: .RE
                    285: .RE
                    286: .TP
                    287: .L "HASHTABLE* hashfree(HASHTABLE* tab)"
                    288: The hash table
                    289: .L tab
                    290: is freed.
                    291: The scope covered table pointer is returned,
                    292: .L NULL
                    293: if
                    294: .L tab
                    295: is not a scope.
                    296: .TP
                    297: .L "char* hashlook(HASHTABLE* tab, char* name, int flags, char* value)"
                    298: Operates on the key
                    299: .L name
                    300: in the hash table
                    301: .L tab
                    302: according to
                    303: .L flags
                    304: and 
                    305: .LR value .
                    306: A
                    307: .L HASHBUCKET
                    308: pointer is returned unless otherwise noted.
                    309: There are three basic lookup operations:
                    310: .RS
                    311: .TP
                    312: .L HASH_CREATE
                    313: .L name
                    314: is entered into the top level scope if it does not already exist.
                    315: If
                    316: .L name
                    317: also appears in a lower scope and
                    318: .L HASH_ALLOC
                    319: is set for the table then the new bucket will share the
                    320: .L name
                    321: field value with the lower scope.
                    322: .TP
                    323: .L HASH_DELETE
                    324: .L name
                    325: is deleted from the top level scope if it exists.
                    326: .L NULL
                    327: is returned.
                    328: .TP
                    329: .L HASH_LOOKUP
                    330: The scopes are searched in order from top to bottom for
                    331: .L name .
                    332: The bucket pointer for the first occurrence is returned.
                    333: .L NULL
                    334: is returned if
                    335: .L name
                    336: is not found.
                    337: .RE
                    338: The basic operations may be qualified by the following
                    339: (the qualifiers are restricted to the basic operations in
                    340: the parenthesized list):
                    341: .RS
                    342: .TP
                    343: .L "HASH_BUCKET (HASH_CREATE,HASH_DELETE,HASH_LOOKUP)"
                    344: .L name
                    345: is a pointer to a bucket that has already been entered into the table.
                    346: .TP
                    347: .L "HASH_FIXED (HASH_CREATE)"
                    348: .L value
                    349: is taken to be the size of the hash bucket to be created for
                    350: .L name
                    351: in the top level scope.
                    352: The minimum bucket size is silently restricted to
                    353: .LR sizeof(HASHHEADER) .
                    354: .TP
                    355: .L "HASH_INSTALL (HASH_CREATE)"
                    356: .L name
                    357: is a pointer to a bucket that has not been entered into the table.
                    358: .TP
                    359: .L "HASH_NOSCOPE (HASH_LOOKUP)"
                    360: The lookup is restricted to the top level scope.
                    361: .TP
                    362: .L "HASH_OPAQUE (HASH_CREATE,HASH_DELETE)"
                    363: Sets
                    364: .L (HASH_CREATE)
                    365: or clears
                    366: .L (HASH_DELETE)
                    367: the
                    368: .I opaque
                    369: property for the bucket.
                    370: An opaque bucket is not visible in lower scopes.
                    371: .TP
                    372: .L "HASH_SCOPE (HASH_CREATE,HASH_DELETE)"
                    373: All scopes are searched for the bucket.
                    374: If the bucket is not found for
                    375: .L HASH_CREATE
                    376: then a new bucket is created in the lowest scope.
                    377: .TP
                    378: .L "HASH_VALUE (HASH_CREATE,HASH_LOOKUP)"
                    379: For
                    380: .L HASH_CREATE
                    381: the bucket
                    382: .L value
                    383: field is set to
                    384: .L value
                    385: and the bucket
                    386: .L name
                    387: value is returned.
                    388: For
                    389: .L HASH_LOOKUP
                    390: the bucket
                    391: .L value 
                    392: field is returned,
                    393: .L NULL
                    394: if the bucket is not found.
                    395: .RE
                    396: If
                    397: .L name
                    398: .L NULL
                    399: then the name from the most recent
                    400: .L hashlook()
                    401: is used, avoiding recomputation of some internal parameters.
                    402: .TP
                    403: .L "char* hashget(HASHTABLE* tab, char* name)"
                    404: Returns the value
                    405: associated with the key
                    406: .L name
                    407: in the hash table
                    408: .LR tab .
                    409: If
                    410: .L name
                    411: is
                    412: .L NULL
                    413: then the name from the most recent
                    414: .L hashget()
                    415: is used, avoiding recomputation of some internal parameters.
                    416: .L NULL
                    417: is returned if
                    418: .L name
                    419: is not in the table.
                    420: All scope covered tables are searched.
                    421: .TP
                    422: .L "HASHBUCKET* hashlast(HASHTABLE* tab)"
                    423: Returns a pointer to the most recent hash bucket for
                    424: the most recent hash table.
                    425: The value is set by
                    426: .LR hashlook() ,
                    427: .L hashscan()
                    428: and
                    429: .LR hashwalk() .
                    430: .TP
                    431: .L "char* hashput(HASHTABLE* tab, char* name, char* value)"
                    432: Set the value of the key
                    433: .L name
                    434: to
                    435: .L value
                    436: in the top level scope of the hash table
                    437: .LR tab .
                    438: .L name
                    439: is entered into the top level scope if necessary.
                    440: The (possibly re-allocated) key name pointer is returned
                    441: (see
                    442: .LR HASH_ALLOCATE ).
                    443: .TP
                    444: .L "int hashwalk(HASHTABLE* tab, int flags, (int(*)()) walker)"
                    445: The function
                    446: .L walker
                    447: is applied to each entry (not covered by a scope starting at
                    448: .LR tab )
                    449: in the hash table
                    450: .LR tab .
                    451: If
                    452: .L flags
                    453: is 
                    454: .L HASH_NOSCOPE
                    455: then only the top level hash table is used, otherwise the walk includes
                    456: all scope covered tables.
                    457: .L walker
                    458: is called with
                    459: .L char*
                    460: .I key
                    461: as the first argument and
                    462: .L char*
                    463: .I value
                    464: as the second argument.
                    465: The walk terminates after the last entry or when
                    466: .L walker
                    467: returns a negative value.
                    468: The return value of the last call to
                    469: .L walker
                    470: is returned.
                    471: Only one walk may be active within a collection of scoped tables.
                    472: .TP
                    473: .L "void hashscan(HASHTABLE* tab, int flags, HASHPOSITION* pos)"
                    474: Initializes 
                    475: .L pos
                    476: for a sequential scan on the hash table
                    477: .LR tab .
                    478: If
                    479: .L flags
                    480: is 
                    481: .L HASH_NOSCOPE
                    482: then only the top level hash table is used, otherwise the scan includes
                    483: all scope covered tables.
                    484: Only one scan may be active within a collection of scoped tables.
                    485: .L hashdone()
                    486: must be called to terminate the scan.
                    487: .TP
                    488: .L "int hashnext(HASHPOSITION* pos)"
                    489: Generates the next element in the sequential scan set up by
                    490: .L hashscan()
                    491: on
                    492: .LR pos .
                    493: If no elements remain then
                    494: .L 0
                    495: is returned.
                    496: Otherwise
                    497: .L pos->bucket
                    498: points to the hash bucket of the next element and
                    499: .L 1
                    500: is returned.
                    501: .TP
                    502: .L "void hashdone(HASHPOSITION* pos)"
                    503: Completes a scan initiated by 
                    504: .L hashscan()
                    505: on 
                    506: .LR pos .
                    507: .TP
                    508: .L "int hashset(HASHTABLE* tab, int flags)"
                    509: Sets the flags for the hash table
                    510: .L tab
                    511: by
                    512: .IR or ing
                    513: in
                    514: .LR flags .
                    515: Only
                    516: .L HASH_ALLOCATE
                    517: and
                    518: .L HASH_FIXED
                    519: may be set.
                    520: .TP
                    521: .L "int hashclear(HASHTABLE* tab, int flags)"
                    522: Clears the flags for the hash table
                    523: .L tab
                    524: by masking out
                    525: .LR flags .
                    526: Only
                    527: .L HASH_ALLOCATE
                    528: and
                    529: .L HASH_FIXED
                    530: may be cleared.
                    531: .TP
                    532: .L "void hashdump(FILE* fp, HASHTABLE* tab, int flags)"
                    533: Dumps hash table accounting info to the output file stream
                    534: .LR fp .
                    535: If
                    536: .L tab
                    537: is 
                    538: .L NULL
                    539: then all allocated hash tables are dumped, otherwise only information on
                    540: .L tab
                    541: is dumped.
                    542: If
                    543: .L flags
                    544: is 
                    545: .L HASH_BUCKET
                    546: then the hash bucket
                    547: .I key-value
                    548: pairs for each collision chain are also dumped.
                    549: .TP
                    550: .L "void hashsize(HASHTABLE* tab, int size)"
                    551: Changes the size of the hash table
                    552: .L tab
                    553: to
                    554: .L size
                    555: where
                    556: .L size
                    557: must be a power of 2.
                    558: Explicit calls to this routine are not necessary as hash tables
                    559: are automatically resized.
                    560: .TP
                    561: .L "int strhash(char* name)"
                    562: Hashes the null terminated character string
                    563: .L name
                    564: using a linear congruent pseudo-random number generator algorithm
                    565: and returns a non-negative
                    566: .L int
                    567: hash value.
                    568: .TP
                    569: .L "int memhash(char* buf, int siz)"
                    570: Hashes the buffer
                    571: .L buf
                    572: of
                    573: .L siz
                    574: bytes using a linear congruent pseudo-random number generator algorithm
                    575: and returns a non-negative
                    576: .L int
                    577: hash value.
                    578: .TP
                    579: .L "long strsum(char* name, long sum)"
                    580: Returns a running 31-bit checksum of the string
                    581: .L name
                    582: where
                    583: .L sum
                    584: is
                    585: .L 0
                    586: on the first call and
                    587: the return value from a previous
                    588: .L memsum
                    589: or
                    590: .L strsum
                    591: call otherwise.
                    592: The checksum value is consistent across all implementations.
                    593: .TP
                    594: .L "long memsum(char* buf, int siz, long sum)"
                    595: Returns a running 31-bit checksum of buffer
                    596: .L buf
                    597: of
                    598: .L siz
                    599: bytes where
                    600: .L sum
                    601: is
                    602: .L 0
                    603: on the first call and
                    604: the return value from a previous
                    605: .L memsum
                    606: or
                    607: .L strsum
                    608: call otherwise.
                    609: The checksum value is consistent across all implementations.
                    610: .SH "SEE ALSO"
                    611: sum(1)

unix.superglobalmegacorp.com

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