SUBROUTINE HASH(KEY,MODE,KA,FOUND) C This file: http://ftp.aset.psu.edu/pub/ger/fortran/hdk/hash.for C C===============BRENT'S HASHING ALGORITHM. C SEE CACM 16(2):105-109. C C THIS ROUTINE WILL LOOK UP AND INSERT OR DELETE C INTEGER KEYS IN THE TABLE KEYTAB. VALUES ASSOCIATED C WITH THE KEYS MAY BE STORED IN THE TABLE KVTAB. THE C ROUTINE IS DESIGNED TO BE EFFICIENT, EVEN IF THE TABLE C IS NEARLY FULL, PROVIDED MOST ENTRIES ARE LOOKED UP C SEVERAL TIMES. C PARAMETERS: C /BRENT/ COMMON BLOCK DESCRIBES: C LEN: THE TABLE LENGTH. MUST BE GIVEN AS A PRIME NUMBER C BEFORE HASH IS CALLED. NO CHECK IS MADE FOR PRIMALITY C C KEYTAB: IS GIVEN AS A LEN-VECTOR FOR STORING THE KEYS. IT C MUST BE INITIALIZED TO ALL ZEROS BEFORE THE FIRST C CALL TO HASH. C C KVTAB: IS USED BY BOTH HASH AND THE CALLING PROGRAM AS C A LEN-VECOTR OF VALUES ASSOCIATED WITH KEYS IN C THE HASH TABLE, KEYTAB. KVTAB COULD ALSO BE A C POINTER VECTOR INITIALIZED TO THE INTEGERS 1,2,...LEN C IF MULTIPLE VALUES ARE ASSOCIATED WITH EACH KEY. C (KEY,MODE,KA,FOUND): C KEY: IS GIVEN AS A POSITIVE INTEGER KEY TO BE ENTERED, C DELETED, OR PROBED FOR. C THE VALUES 0 AND -1 ARE RESERVED FOR EMPTY SPACE C OR DELETED ITEM RESPECTIVELY. C C MODE: IS GIVEN AS AN INDICATOR AS FOLLOWS... C MODE=1: MEANS LOOK UP ONLY. IF THE KEY IS IN KEYTAB, THEN C KA IS RETURNED AS THE SUBSCRIPT POINTER; OTHERWISE C KA IS RETURNED 0. THE VALUE ASSOCIATED WITH C KEYTAB(KA) IS KVTAB(KA) WHEN KA IS NOT ZERO. C MODE=2: MEANS LOOK UP AND ENTER. THIS IS USED TO BUILD C THE TABLE. OTHERWISE THE KEY IS ENTERED AT C KEYTAB(KA). KA IS RETURNED AS THE POINTER SUBSCRIPT C IN EITHER CASE, OR KA=0 IF AN ENTRY IS ATTEMPTED AND C THE TABLE IS FULL OR KA=0 IF KEY=0. UPON RETURN, C WHEN FOUND=.FALSE., THE CALLING PROGRAM MUST ENTER C THE VALUE ASSOCIATED WITH KEY WHEN MODE=2. C MODE=3: MEANS LOOK UP AND DELETE. IF THE KEY IS IN THE TABLE C IT IS DELETED AND ITS FORMER ADDRESS KA IS RETURNED. C IF THE KEY IS NOT THERE, KA=0 IS RETURNED. (THE C SUBROUTINE CAN BE SIMPLIFIED CONSIDERABLY IF KEYS C NEVER DELETED). C C KA: IS RETUNED AS THE SUBSCRIPT OF KEYTAB SUCH THAT C KEY=KEYTAB(KA) OR KA IS RETURNED AS ZERO IF KEY=0 C OR KEY IS NOT IN KEYTAB. C C FOUND: IS A LOGICAL FLAG RETURNED .TRUE. IF THE KEY WAS C FOUND IN KEYTAB; ELSE FOUND IS RETURNED .FALSE. . C LOGICAL FOUND,DEL C-----------THE COMMON STATEMENT BELOW MUST BE CHANGED TO MEET C THE PROBLEM SIZE. COMMON/BRENT/LEN,KEYTAB(73),KVTAB(73) LEN2=LEN-2 IC=-1 C--------COMPUTE ADDRESS OF FIRST PROBE(IR) AND INCREMENT(IQ). C ANY INDEPENDENT PSEUDO-RANDOM FUNCTIONS OF THE KEY MAY BE USED, C PROVIDED 0