diff --git a/src/program.c b/src/program.c
index 771a73aa325ff8ef21388abab08d6e9579096fff..a415947f6fd73637b89e631a05898131d024e510 100644
--- a/src/program.c
+++ b/src/program.c
@@ -11735,10 +11735,15 @@ static int low_implements(struct program *a, struct program *b)
   return 1;
 }
 
-#define IMPLEMENTS_CACHE_SIZE 4711
+#define IMPLEMENTS_CACHE_SIZE 1024
 struct implements_cache_s { INT32 aid, bid, ret; };
 static struct implements_cache_s implements_cache[IMPLEMENTS_CACHE_SIZE];
 
+static int implements_hval( INT32 aid, INT32 bid )
+{
+    return ((aid<<4) ^ bid ^ (aid>>4)) & (IMPLEMENTS_CACHE_SIZE-1);
+}
+
 /* returns 1 if a implements b, but faster */
 PMOD_EXPORT int implements(struct program *a, struct program *b)
 {
@@ -11746,12 +11751,7 @@ PMOD_EXPORT int implements(struct program *a, struct program *b)
   if(!a || !b) return -1;
   if(a==b) return 1;
 
-  hval = (unsigned)a->id*9248339 + (unsigned)b->id;
-  hval %= IMPLEMENTS_CACHE_SIZE;
-#ifdef PIKE_DEBUG
-  if(hval >= IMPLEMENTS_CACHE_SIZE)
-    Pike_fatal("Implements_cache failed!\n");
-#endif
+  hval = implements_hval(a->id,b->id);
   if(implements_cache[hval].aid==a->id && implements_cache[hval].bid==b->id)
   {
     return implements_cache[hval].ret;
@@ -11831,12 +11831,7 @@ PMOD_EXPORT int is_compatible(struct program *a, struct program *b)
     bid = tmp;
   }
 
-  hval = (unsigned long)aid*9248339 + (unsigned long)bid;
-  hval %= IMPLEMENTS_CACHE_SIZE;
-#ifdef PIKE_DEBUG
-  if(hval >= IMPLEMENTS_CACHE_SIZE)
-    Pike_fatal("Implements_cache failed!\n");
-#endif
+  hval = implements_hval(aid,bid);
   if(is_compatible_cache[hval].aid==aid &&
      is_compatible_cache[hval].bid==bid)
   {
@@ -11849,12 +11844,7 @@ PMOD_EXPORT int is_compatible(struct program *a, struct program *b)
     /* a implements b */
     return 1;
   }
-  rhval = (unsigned long)bid*9248339 + (unsigned long)aid;
-  rhval %= IMPLEMENTS_CACHE_SIZE;
-#ifdef PIKE_DEBUG
-  if(rhval >= IMPLEMENTS_CACHE_SIZE)
-    Pike_fatal("Implements_cache failed!\n");
-#endif
+  rhval = implements_hval(bid,aid);
   if(implements_cache[rhval].aid==bid &&
      implements_cache[rhval].bid==aid &&
      implements_cache[rhval].ret)