diff Objects/object.c @ 51603:ff096d6a9222

Merged revisions 69582-69583 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r69582 | antoine.pitrou | 2009-02-13 14:52:33 +0100 (ven., 13 févr. 2009) | 4 lines Issue #5186: Reduce hash collisions for objects with no __hash__ method by rotating the object pointer by 4 bits to the right. ........ r69583 | antoine.pitrou | 2009-02-13 14:57:40 +0100 (ven., 13 févr. 2009) | 3 lines Fix compiler warning (gcc) ........
author Antoine Pitrou <solipsis@pitrou.net>
date Fri, 13 Feb 2009 14:01:05 +0000
parents 224d0efcbf6c
children d06a3ebf306f
line wrap: on
line diff
--- a/Objects/object.c	Fri Feb 13 11:10:15 2009 +0000
+++ b/Objects/object.c	Fri Feb 13 14:01:05 2009 +0000
@@ -699,23 +699,15 @@
 long
 _Py_HashPointer(void *p)
 {
-#if SIZEOF_LONG >= SIZEOF_VOID_P
-	return (long)p;
-#else
-	/* convert to a Python long and hash that */
-	PyObject* longobj;
 	long x;
-
-	if ((longobj = PyLong_FromVoidPtr(p)) == NULL) {
-		x = -1;
-		goto finally;
-	}
-	x = PyObject_Hash(longobj);
-
-finally:
-	Py_XDECREF(longobj);
+	size_t y = (size_t)p;
+	/* bottom 3 or 4 bits are likely to be 0; rotate y by 4 to avoid
+	   excessive hash collisions for dicts and sets */
+	y = (y >> 4) | (y << (8 * SIZEOF_VOID_P - 4));
+	x = (long)y;
+	if (x == -1)
+		x = -2;
 	return x;
-#endif
 }
 
 long