DIRECTORY Basics USING [BITSHIFT, BITXOR, HighHalf, LowHalf], JaMBasic USING [Object], JaMDict USING [], JaMVM USING [GetText]; JaMHashImpl: PROGRAM IMPORTS JaMVM, Basics EXPORTS JaMDict = { OPEN VM:JaMVM, JaMBasic; HashObject: PUBLIC PROC[key: Object] RETURNS[CARDINAL] = { WITH k: key SELECT FROM integer => RETURN[Basics.LowHalf[k.ivalue]]; real => RETURN[Basics.HighHalf[LOOPHOLE[k.rvalue]]]; boolean => RETURN[LOOPHOLE[k.bvalue]]; name => RETURN[k.id.index]; string => RETURN[HashString[k]]; stream => RETURN[k.index]; command => RETURN[k.index]; ENDCASE => RETURN[0]; }; maxLength: CARDINAL = 20; HashString: PUBLIC PROC[s: string Object] RETURNS[CARDINAL] = { text: STRING _ [maxLength]; VM.GetText[s,text]; RETURN[InlineHash[text,s.length]] }; HashText: PUBLIC PROC[text: LONG STRING] RETURNS[CARDINAL] = { RETURN[InlineHash[text,text.length]] }; InlineHash: PROC[text: LONG STRING, h: CARDINAL] RETURNS[CARDINAL] = INLINE { len: CARDINAL _ MIN[text.length,maxLength]; FOR i: CARDINAL IN[1..MIN[3,len]) DO h _ Basics.BITXOR[Basics.BITSHIFT[h,1], LOOPHOLE[text[i]]]; ENDLOOP; IF len >= 2 THEN FOR i: CARDINAL IN[len - 2..len) DO h _ Basics.BITXOR[Basics.BITSHIFT[h,1], LOOPHOLE[text[i]]]; ENDLOOP; RETURN[h]; }; }. śJaMHashImpl.mesa Doug Wyatt, 1-Oct-81 13:43:53 Russ Atkinson, July 22, 1983 6:18 pm hashes object key into a CARDINAL Expects caller to do: (h MOD range) to allow for different ranges with same key HashString and HashText must be consistent! Źs˜šœ™Jšœ™J™$—J˜šĻk ˜ Jšœœœœ˜3Jšœ œ ˜Jšœœ˜Jšœœ ˜J˜—šœ ˜Jšœ˜Jšœ ˜Jšœœ˜—J˜š Ļn œœœœœ˜:Jšœ!™!JšœO™Ošœœ˜Jšœ œ˜,Jšœœœ ˜4Jšœ œœ ˜&Jšœœ ˜Jšœ œ˜ Jšœ œ ˜Jšœ œ ˜Jšœœ˜—J˜J˜—Jšœ+™+J˜Jšœ œ˜J˜š ž œœœœœ˜?Jšœœœ˜/Jšœ˜$J˜—šžœœœœœœœ˜>Jšœ!˜'J˜—šž œœœœœœœœ˜MJšœœœ˜+š œœœœ ˜$Jšœ œœœ ˜;Jšœ˜—š œ œœœœ˜4Jšœ œœœ ˜;Jšœ˜—Jšœ˜ Jšœ˜J˜—J˜J˜J˜—…—Ņ?