From 950c0b37473e010c7502be5e1c949c6747fb184a Mon Sep 17 00:00:00 2001 From: Dianne Skoll Date: Sat, 12 Oct 2024 10:17:50 -0400 Subject: [PATCH] Use HashPJW for hasing user-defined function names and variable names. --- src/userfns.c | 20 ++-- src/var.c | 20 ++-- tests/test.cmp | 258 ++++++++++++++++++++++++------------------------- 3 files changed, 149 insertions(+), 149 deletions(-) diff --git a/src/userfns.c b/src/userfns.c index a53aa3e4..b41dfc77 100644 --- a/src/userfns.c +++ b/src/userfns.c @@ -44,17 +44,17 @@ static void FSet (UserFunc *f); /***************************************************************/ unsigned int HashVal_nocase(char const *str) { - register unsigned int i=0; - register unsigned int j=1; - register unsigned int len=0; - - while(*str && len < VAR_NAME_LEN) { - i += j * (*str); - str++; - len++; - j = 3-j; + unsigned int h = 0, high; + while(*str) { + h = (h << 4) + (unsigned int) *str; + str++; + high = h & 0xF0000000; + if (high) { + h ^= (high >> 24); + } + h &= ~high; } - return i; + return h; } /***************************************************************/ diff --git a/src/var.c b/src/var.c index eb82cf17..8a534185 100644 --- a/src/var.c +++ b/src/var.c @@ -461,17 +461,17 @@ static int time_sep_func(int do_set, Value *val) /***************************************************************/ unsigned int HashVal(char const *str) { - register unsigned int i=0; - register unsigned int j=1; - register unsigned int len=0; - - while(*str && len < VAR_NAME_LEN) { - i += j * (unsigned int) UPPER(*str); - str++; - len++; - j = 3-j; + unsigned int h = 0, high; + while(*str) { + h = (h << 4) + (unsigned int) UPPER(*str); + str++; + high = h & 0xF0000000; + if (high) { + h ^= (high >> 24); + } + h &= ~high; } - return i; + return h; } /***************************************************************/ diff --git a/tests/test.cmp b/tests/test.cmp index b97adce3..00492c8f 100644 --- a/tests/test.cmp +++ b/tests/test.cmp @@ -2578,141 +2578,141 @@ wkdaynum(1993-12-27) => 1 dump Variable Value -a017 29 -a036 "bar" -a054b 11:22 -a055 1 -a074 "Tuesday, 5 May, 1992 In 444 days' time T"... -a093 0 -a116 -4 -a135 72:00 -a008 "11:44" -a027 0 -a046 "ies" -a065 1 -a084 7 -a107 3 -a126 14:00 -a018 1 -a037 1991-02-15 -a056 "SDFJHSDF KSJDFH KJSDFH KSJDFH" -a075 "05-05 Tuesday, May 5th, 1992 Tuesday, Ma"... -a094 0 -a117 -3 -a136 "FILE" -a028 1 -a047 -1 -a066 0 -a085 7 -a108 14 -a127 04:30 -a019 0 -a038 33 -a057 "SDFJHSDF KSJDFH KJSDFH KSJDFH" -a076 "S' 05 Th 05 Tuesday, 5th May, 1992 Tuesd"... -a095 -1 -a118 0 -a029 0 -a048 "foo" -a067 "INT" -a086 4 -a109 2012-01-01 -a128 2018-02-03@16:45 -a039 "February" -a058 "05.00.06" -a077 "1992 92\n" -a096 -4 -a119 -1 -a049 21 -a068 "STRING" -a087 3 -a129 2019-02-03@16:14 -a059 "Saturday" -a078 1991-04-07 -a097 -3 -a069 "TIME" -a088 14 -a079 1992-04-26 -a098 0 -a089 2012-01-01 -a099 -1 -a000 1 a010 12 -a001 1 -a020 "../tests/test.rem" -a100 2010-09-03 -a011 704 -a030 1 -a110 1991-02-16 -a002 102 -a021 "foo bar baz" -a040 2 -a101 2010-09-03 -a120 2010-09-03 -a012 411 -a031 "foobarbaz" -a111 -1 -a130 1991-02-16 -a003 1990 -a022 11 -a041 "3rd" -a060 6 -a102 5000 -a121 2010-09-03 -a013 1992-02-02 -a032 34 -a070 "DATE" -a112 7 -a131 00:00 -a004 "B7BMB" -a023 1 -a042 "4th" -a061 1991 -a080 2027-05-02 -a103 0 -a122 5000 -a033 "foo" -a052 03:07 -a071 2 a090 1991-02-16 -a113 15 -a131b 00:00 -a132 1991-02-16@00:00 -a005 "baz" -a024 0 -a043 "UNIX" -a062 -19 -a081 "" -a104 0 -a123 0 -a015 16 -a034 1991-02-17 -a053 1992-01-10 -a072 0 +a110 1991-02-16 +a011 704 a091 -1 -a114 2 -a133 16:00 -a006 "1" -a025 4 -a044 "s" -a063 0 -a082 1991-03-13 -a105 -1 -a124 0 -mltest "a b" -a016 28 -a035 1 -a054 11:22 +a111 -1 +a012 411 +a052 03:07 +a054b 11:22 a092 7 +a112 7 +a013 1992-02-02 +a053 1992-01-10 +a093 0 +a113 15 +mltest "a b" +a054 11:22 +a094 0 +a114 2 +a015 16 +a055 1 +a095 -1 a115 03:33 -a134 1991-02-13@16:00 -a007 "1991-02-16" -a026 7 -a045 "iess" +a016 28 +a056 "SDFJHSDF KSJDFH KJSDFH KSJDFH" +a096 -4 +a116 -4 +a017 29 +a057 "SDFJHSDF KSJDFH KJSDFH KSJDFH" +a097 -3 +a117 -3 +a018 1 +a058 "05.00.06" +a098 0 +a118 0 +a019 0 +a059 "Saturday" +a099 -1 +a119 -1 +a020 "../tests/test.rem" +a060 6 +a120 2010-09-03 +a021 "foo bar baz" +a061 1991 +a121 2010-09-03 +a022 11 +a062 -19 +a122 5000 +a131b 00:00 +a023 1 +a063 0 +a123 0 +a024 0 a064 1 -a083 1991-03-24 -a106 4 +a124 0 +a025 4 +a065 1 a125 -1 +a026 7 +a066 0 +a126 14:00 +a027 0 +a067 "INT" +a127 04:30 +a028 1 +a068 "STRING" +a128 2018-02-03@16:45 +a029 0 +a069 "TIME" +a129 2019-02-03@16:14 +a030 1 +a070 "DATE" +a130 1991-02-16 +a031 "foobarbaz" +a071 2 +a131 00:00 +a032 34 +a072 0 +a132 1991-02-16@00:00 +a033 "foo" +a133 16:00 +a034 1991-02-17 +a074 "Tuesday, 5 May, 1992 In 444 days' time T"... +a134 1991-02-13@16:00 +a035 1 +a075 "05-05 Tuesday, May 5th, 1992 Tuesday, Ma"... +a135 72:00 +a036 "bar" +a076 "S' 05 Th 05 Tuesday, 5th May, 1992 Tuesd"... +a136 "FILE" +a037 1991-02-15 +a077 "1992 92\n" +a038 33 +a078 1991-04-07 +a039 "February" +a079 1992-04-26 +a000 1 +a040 2 +a080 2027-05-02 +a100 2010-09-03 +a001 1 +a041 "3rd" +a081 "" +a101 2010-09-03 +a002 102 +a042 "4th" +a082 1991-03-13 +a102 5000 +a003 1990 +a043 "UNIX" +a083 1991-03-24 +a103 0 +a004 "B7BMB" +a044 "s" +a084 7 +a104 0 +a005 "baz" +a045 "iess" +a085 7 +a105 -1 +a006 "1" +a046 "ies" +a086 4 +a106 4 +a007 "1991-02-16" +a047 -1 +a087 3 +a107 3 +a008 "11:44" +a048 "foo" +a088 14 +a108 14 +a049 21 +a089 2012-01-01 +a109 2012-01-01 dump $ Variable Value @@ -5688,7 +5688,7 @@ Barf DEBUG +s # Don't want Remind to queue reminders EXIT - Var hash: total = 141; maxlen = 8; avglen = 2.203 + Var hash: total = 141; maxlen = 5; avglen = 2.203 Func hash: total = 15; maxlen = 3; avglen = 0.469 Expression nodes allocated: 128 Expression nodes high-water: 73