--- 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!