TYPE HashValue = INTEGER; (* 0..1023 *)
PROCEDURE HashString(string: ARRAY OF CHAR) : HashValue;
VAR
index: INTEGER;
hashval, ordval: INTEGER;
ch: CHAR;
BEGIN
hashval := 0; index := 0;
WHILE (index < LEN(string)) & (string[index] # 0X) DO
ch := string[index];
IF ch >= " " THEN
ordval := ORD(ch) - ORD(" ");
ELSE
ordval := ORD(MAX(CHAR)) - ORD(" ") + ORD(ch);
END;
hashval := SHORT(SYSTEM.ROT(hashval, -5)) + ordval;
INC(index);
END;
RETURN SHORT(SYSTEM.LSH(1327217883 * hashval, 10 - 32))
END HashString;
|