CharacterArray.st
changeset 3985 087595c7629b
parent 3926 4cc33691696a
child 3987 b3a2a7377640
--- a/CharacterArray.st	Sun Feb 14 12:15:07 1999 +0100
+++ b/CharacterArray.st	Mon Feb 15 09:48:26 1999 +0100
@@ -2645,38 +2645,60 @@
 
 %{  /* NOCONTEXT */
 
-    REGISTER int g, val;
+    REGISTER unsigned g, val;
     REGISTER unsigned char *cp, *cp0;
     int l;
 
     cp = __stringVal(self);
     l = __stringSize(self);
-    if (__qClass(self) != @global(String)) {
-	int n = __OBJS2BYTES__(__intVal(__ClassInstPtr(__qClass(self))->c_ninstvars));
-
-	cp += n;
-	l -= n;
+    if (__qClass(self) != @global(Strung)) {
+        int n = __OBJS2BYTES__(__intVal(__ClassInstPtr(__qClass(self))->c_ninstvars));
+
+        cp += n;
+        l -= n;
     }
 
     /*
-     * this is the dragon-book algorithm with a funny start
-     * value (to give short strings a number above 8192)
+     * this is the dragon-book algorithm 
      */
-    val = 12345;
-    for (cp0 = cp, cp += l - 1; cp >= cp0; cp--) {
-	val = (val << 5) + (*cp & 0x1F);
-	if (g = (val & 0x3E000000))
-	    val ^= g >> 25 /* 23 */ /* 25 */;
-	val &= 0x3FFFFFFF;
+
+    val = 0;
+    switch (l) {
+    default:
+        for (cp0 = cp, cp += l - 1; cp >= cp0; cp--) {
+            val = (val << 4) + *cp;
+            if (g = (val & 0xF0000000)) {
+                val ^= g >> 24;
+                val ^= g;
+            }
+        }
+        break;
+    case 7:
+        val = cp[6] << 4;
+    case 6:
+        val = (val + cp[5]) << 4;
+    case 5:
+        val = (val + cp[4]) << 4;
+    case 4:
+        val = (val + cp[3]) << 4;
+    case 3:
+        val = (val + cp[2]) << 4;
+    case 2:
+        val = (val + cp[1]) << 4;
+    case 1:
+        val = val + cp[0];
+    case 0:
+        break;
     }
 
-    if (l) {
-	l |= 1; 
-	val = (val * l) & 0x3FFFFFFF;
-    }
-
-    RETURN ( __MKSMALLINT(val) );
+    /*
+     * multiply by large prime to spread values
+     * This speeds up Set and Dictionary by a factor of 10!
+     */
+    val *= 31415821;
+    RETURN ( __MKSMALLINT(val & 0x3fffffff));
 %}
+
 !
 
 sameAs:aString
@@ -5208,6 +5230,6 @@
 !CharacterArray class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/CharacterArray.st,v 1.155 1998-11-11 15:02:35 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/CharacterArray.st,v 1.156 1999-02-15 08:48:26 stefan Exp $'
 ! !
 CharacterArray initialize!