⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hash.3

📁 tcl是工具命令语言
💻 3
字号:
'\"'\" Copyright (c) 1989-1993 The Regents of the University of California.'\" Copyright (c) 1994-1996 Sun Microsystems, Inc.'\"'\" See the file "license.terms" for information on usage and redistribution'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.'\" '\" RCS: @(#) $Id: Hash.3,v 1.10 2002/07/11 15:40:19 dgp Exp $'\" .so man.macros.TH Tcl_Hash 3 "" Tcl "Tcl Library Procedures".BS.SH NAMETcl_InitHashTable, Tcl_InitCustomHashTable, Tcl_InitObjHashTable, Tcl_DeleteHashTable, Tcl_CreateHashEntry, Tcl_DeleteHashEntry, Tcl_FindHashEntry, Tcl_GetHashValue, Tcl_SetHashValue, Tcl_GetHashKey, Tcl_FirstHashEntry, Tcl_NextHashEntry, Tcl_HashStats \- procedures to manage hash tables.SH SYNOPSIS.nf\fB#include <tcl.h>\fR.sp\fBTcl_InitHashTable\fR(\fItablePtr, keyType\fR).sp\fBTcl_InitCustomHashTable\fR(\fItablePtr, keyType, typePtr\fR).sp\fBTcl_InitObjHashTable\fR(\fItablePtr\fR).sp\fBTcl_DeleteHashTable\fR(\fItablePtr\fR).spTcl_HashEntry *\fBTcl_CreateHashEntry\fR(\fItablePtr, key, newPtr\fR).sp\fBTcl_DeleteHashEntry\fR(\fIentryPtr\fR).spTcl_HashEntry *\fBTcl_FindHashEntry\fR(\fItablePtr, key\fR).spClientData\fBTcl_GetHashValue\fR(\fIentryPtr\fR).sp\fBTcl_SetHashValue\fR(\fIentryPtr, value\fR).spchar *\fBTcl_GetHashKey\fR(\fItablePtr, entryPtr\fR).spTcl_HashEntry *\fBTcl_FirstHashEntry\fR(\fItablePtr, searchPtr\fR).spTcl_HashEntry *\fBTcl_NextHashEntry\fR(\fIsearchPtr\fR).spCONST char *\fBTcl_HashStats\fR(\fItablePtr\fR).SH ARGUMENTS.AS Tcl_HashSearch *searchPtr.AP Tcl_HashTable *tablePtr inAddress of hash table structure (for all procedures but\fBTcl_InitHashTable\fR, this must have been initialized byprevious call to \fBTcl_InitHashTable\fR)..AP int keyType inKind of keys to use for new hash table.  Must be eitherTCL_STRING_KEYS, TCL_ONE_WORD_KEYS, TCL_CUSTOM_TYPE_KEYS,TCL_CUSTOM_PTR_KEYS, or an integer value greater than 1..AP Tcl_HashKeyType *typePtr inAddress of structure which defines the behaviour of the hash table..AP "CONST char" *key inKey to use for probe into table.  Exact form depends on\fIkeyType\fR used to create table..AP int *newPtr outThe word at \fI*newPtr\fR is set to 1 if a new entry was createdand 0 if there was already an entry for \fIkey\fR..AP Tcl_HashEntry *entryPtr inPointer to hash table entry..AP ClientData value inNew value to assign to hash table entry.  Need not have typeClientData, but must fit in same space as ClientData..AP Tcl_HashSearch *searchPtr inPointer to record to use to keep track of progress in enumeratingall the entries in a hash table..BE.SH DESCRIPTION.PPA hash table consists of zero or more entries, each consisting of akey and a value.  Given the key for an entry, the hashing routines canvery quickly locate the entry, and hence its value. There may be atmost one entry in a hash table with a particular key, but many entriesmay have the same value.  Keys can take one of four forms: strings,one-word values, integer arrays, or custom keys defined by aTcl_HashKeyType structure (See section \fBTHE TCL_HASHKEYTYPESTRUCTURE\fR below). All of the keys in a given table have the sameform, which is specified when the table is initialized..PPThe value of a hash table entry can be anything that fits in the samespace as a ``char *'' pointer.  Values for hash table entries aremanaged entirely by clients, not by the hash module itself.  Typicallyeach entry's value is a pointer to a data structure managed by clientcode..PPHash tables grow gracefully as the number of entries increases, sothat there are always less than three entries per hash bucket, onaverage. This allows for fast lookups regardless of the number ofentries in a table..PPThe core provides three functions for the initialization of hashtables, Tcl_InitHashTable, Tcl_InitObjHashTable andTcl_InitCustomHashTable..PP\fBTcl_InitHashTable\fR initializes a structure that describes a newhash table.  The space for the structure is provided by the caller,not by the hash module.  The value of \fIkeyType\fR indicates whatkinds of keys will be used for all entries in the table. All of thekey types described later are allowed, with the exception of\fBTCL_CUSTOM_TYPE_KEYS\fR and \fBTCL_CUSTOM_PTR_KEYS\fR..PP\fBTcl_InitObjHashTable\fR is a wrapper around\fBTcl_InitCustomHashTable\fR and initializes a hash table whose keysare Tcl_Obj *..PP\fBTcl_InitCustomHashTable\fR initializes a structure that describes anew hash table. The space for the structure is provided by thecaller, not by the hash module.  The value of \fIkeyType\fR indicateswhat kinds of keys will be used for all entries in the table.\fIKeyType\fR must have one of the following values:.IP \fBTCL_STRING_KEYS\fR 25Keys are null-terminated ASCII strings.They are passed to hashing routines using the address of thefirst character of the string..IP \fBTCL_ONE_WORD_KEYS\fR 25Keys are single-word values;  they are passed to hashing routinesand stored in hash table entries as ``char *'' values.The pointer value is the key;  it need not (and usually doesn't)actually point to a string..IP \fBTCL_CUSTOM_TYPE_KEYS\fR 25Keys are of arbitrary type, and are stored in the entry. Hashingand comparison is determined by \fItypePtr\fR. The Tcl_HashKeyType structure is described in the section \fBTHE TCL_HASHKEYTYPE STRUCTURE\fR below..IP \fBTCL_CUSTOM_PTR_KEYS\fR 25Keys are pointers to an arbitrary type, and are stored in the entry. Hashingand comparison is determined by \fItypePtr\fR. The Tcl_HashKeyType structure is described in the section \fBTHE TCL_HASHKEYTYPE STRUCTURE\fR below..IP \fIother\fR 25If \fIkeyType\fR is not one of the above,then it must be an integer value greater than 1.In this case the keys will be arrays of ``int'' values, where\fIkeyType\fR gives the number of ints in each key.This allows structures to be used as keys.All keys must have the same size.Array keys are passed into hashing functions using the addressof the first int in the array..PP\fBTcl_DeleteHashTable\fR deletes all of the entries in a hashtable and frees up the memory associated with the table'sbucket array and entries.It does not free the actual table structure (pointed toby \fItablePtr\fR), since that memory is assumed to be managedby the client.\fBTcl_DeleteHashTable\fR also does not free or otherwisemanipulate the values of the hash table entries.If the entry values point to dynamically-allocated memory, thenit is the client's responsibility to free these structuresbefore deleting the table..PP\fBTcl_CreateHashEntry\fR locates the entry corresponding to aparticular key, creating a new entry in the table if therewasn't already one with the given key.If an entry already existed with the given key then \fI*newPtr\fRis set to zero.If a new entry was created, then \fI*newPtr\fR is set to a non-zerovalue and the value of the new entry will be set to zero.The return value from \fBTcl_CreateHashEntry\fR is a pointer tothe entry, which may be used to retrieve and modify the entry'svalue or to delete the entry from the table..PP\fBTcl_DeleteHashEntry\fR will remove an existing entry from atable.The memory associated with the entry itself will be freed, butthe client is responsible for any cleanup associated with theentry's value, such as freeing a structure that it points to..PP\fBTcl_FindHashEntry\fR is similar to \fBTcl_CreateHashEntry\fRexcept that it doesn't create a new entry if the key doesn't exist;instead, it returns NULL as result..PP\fBTcl_GetHashValue\fR and \fBTcl_SetHashValue\fR are used toread and write an entry's value, respectively.Values are stored and retrieved as type ``ClientData'', which islarge enough to hold a pointer value.  On almost all machines this islarge enough to hold an integer value too..PP\fBTcl_GetHashKey\fR returns the key for a given hash table entry,either as a pointer to a string, a one-word (``char *'') key, oras a pointer to the first word of an array of integers, dependingon the \fIkeyType\fR used to create a hash table.In all cases \fBTcl_GetHashKey\fR returns a result with type``char *''.When the key is a string or array, the result of \fBTcl_GetHashKey\fRpoints to information in the table entry;  this information willremain valid until the entry is deleted or its table is deleted..PP\fBTcl_FirstHashEntry\fR and \fBTcl_NextHashEntry\fR may be usedto scan all of the entries in a hash table.A structure of type ``Tcl_HashSearch'', provided by the client,is used to keep track of progress through the table.\fBTcl_FirstHashEntry\fR initializes the search record andreturns the first entry in the table (or NULL if the table isempty).Each subsequent call to \fBTcl_NextHashEntry\fR returns thenext entry in the table orNULL if the end of the table has been reached.A call to \fBTcl_FirstHashEntry\fR followed by calls to\fBTcl_NextHashEntry\fR will return each of the entries inthe table exactly once, in an arbitrary order.It is unadvisable to modify the structure of the table, e.g.by creating or deleting entries, while the search is inprogress..PP\fBTcl_HashStats\fR returns a dynamically-allocated string withoverall information about a hash table, such as the number ofentries it contains, the number of buckets in its hash array,and the utilization of the buckets.It is the caller's responsibility to free the result stringby passing it to \fBckfree\fR..PPThe header file \fBtcl.h\fR defines the actual data structuresused to implement hash tables.This is necessary so that clients can allocate Tcl_HashTablestructures and so that macros can be used to read and writethe values of entries.However, users of the hashing routines should never refer directlyto any of the fields of any of the hash-related data structures;use the procedures and macros defined here..SH "THE TCL_HASHKEYTYPE STRUCTURE".PPExtension writers can define new hash key types by defining fourprocedures, initializing a Tcl_HashKeyType structure to describethe type, and calling \fBTcl_InitCustomHashTable\fR.The \fBTcl_HashKeyType\fR structure is defined as follows:.CStypedef struct Tcl_HashKeyType {    int \fIversion\fR;    int \fIflags\fR;    Tcl_HashKeyProc *\fIhashKeyProc\fR;    Tcl_CompareHashKeysProc *\fIcompareKeysProc\fR;    Tcl_AllocHashEntryProc *\fIallocEntryProc\fR;    Tcl_FreeHashEntryProc *\fIfreeEntryProc\fR;} Tcl_HashKeyType;.CE.PPThe \fIversion\fR member is the version of the table. If thisstructure is extended in future then the version can be usedto distinguish between different structures. It should be setto \fBTCL_HASH_KEY_TYPE_VERSION\fR..PPThe \fIflags\fR member is one or more of the following values OR'ed together:.IP \fBTCL_HASH_KEY_RANDOMIZE_HASH\fR 25There are some things, pointers for example which don't hash well because they do not use the lower bits. If this flag is set then thehash table will attempt to rectify this by randomising the bits and then using the upper N bits as the index into the table..PPThe \fIhashKeyProc\fR member contains the address of a function called to calculate a hash value for the key..CStypedef unsigned int (Tcl_HashKeyProc) (    Tcl_HashTable *\fItablePtr\fR,    VOID *\fIkeyPtr\fR);.CEIf this is NULL then \fIkeyPtr\fR is used and \fBTCL_HASH_KEY_RANDOMIZE_HASH\fR is assumed..PPThe \fIcompareKeysProc\fR member contains the address of a function called to compare two keys..CStypedef int (Tcl_CompareHashKeysProc) (VOID *\fIkeyPtr\fR,    Tcl_HashEntry *\fIhPtr\fR);.CEIf this is NULL then the \fIkeyPtr\fR pointers are compared.If the keys don't match then the function returns 0, otherwiseit returns 1..PPThe \fIallocEntryProc\fR member contains the address of a function called to allocate space for an entry and initialise the key..CStypedef Tcl_HashEntry *(Tcl_AllocHashEntryProc) (    Tcl_HashTable *\fItablePtr\fR, VOID *\fIkeyPtr\fR);.CEIf this is NULL then Tcl_Alloc is used to allocate enough space for aTcl_HashEntry and the key pointer is assigned to key.oneWordValue.String keys and array keys use this function to allocate enough space for the entry and the key in one block, rather than doingit in two blocks. This saves space for a pointer to the key fromthe entry and another memory allocation. Tcl_Obj * keys use this function to allocate enough space for an entry and increment the reference count on the object.If .PPThe \fIfreeEntryProc\fR member contains the address of a function called to free space for an entry..CStypedef void (Tcl_FreeHashEntryProc) (Tcl_HashEntry *\fIhPtr\fR);.CEIf this is NULL then Tcl_Free is used to free the space for the entry. Tcl_Obj * keys use this function to decrement thereference count on the object..SH KEYWORDShash table, key, lookup, search, value

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -