]> granicus.if.org Git - php/commitdiff
Reduce number of hash collisions during dulicate address detection.
authorDmitry Stogov <dmitry@zend.com>
Mon, 11 Dec 2017 15:16:54 +0000 (18:16 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 11 Dec 2017 15:16:54 +0000 (18:16 +0300)
ext/opcache/zend_shared_alloc.c

index 91496b15df0241020973328bce3c3ed3c6785e6a..1ba1ac463cb778eba4dc2e160ccbaddf78eae404 100644 (file)
@@ -337,8 +337,10 @@ void *zend_shared_alloc(size_t size)
 int zend_shared_memdup_size(void *source, size_t size)
 {
        void *old_p;
+       zend_ulong key = (zend_ulong)source;
 
-       if ((old_p = zend_hash_index_find_ptr(&ZCG(xlat_table), (zend_ulong)source)) != NULL) {
+       key = (key >> 3) | (key << ((sizeof(key) * 8) - 3)); /* key  = _rotr(key, 3);*/
+       if ((old_p = zend_hash_index_find_ptr(&ZCG(xlat_table), key)) != NULL) {
                /* we already duplicated this pointer */
                return 0;
        }
@@ -349,8 +351,10 @@ int zend_shared_memdup_size(void *source, size_t size)
 void *_zend_shared_memdup(void *source, size_t size, zend_bool free_source)
 {
        void *old_p, *retval;
+       zend_ulong key = (zend_ulong)source;
 
-       if ((old_p = zend_hash_index_find_ptr(&ZCG(xlat_table), (zend_ulong)source)) != NULL) {
+       key = (key >> 3) | (key << ((sizeof(key) * 8) - 3)); /* key  = _rotr(key, 3);*/
+       if ((old_p = zend_hash_index_find_ptr(&ZCG(xlat_table), key)) != NULL) {
                /* we already duplicated this pointer */
                return old_p;
        }
@@ -443,14 +447,19 @@ void zend_shared_alloc_clear_xlat_table(void)
 
 void zend_shared_alloc_register_xlat_entry(const void *old, const void *new)
 {
-       zend_hash_index_add_new_ptr(&ZCG(xlat_table), (zend_ulong)old, (void*)new);
+       zend_ulong key = (zend_ulong)old;
+
+       key = (key >> 3) | (key << ((sizeof(key) * 8) - 3)); /* key  = _rotr(key, 3);*/
+       zend_hash_index_add_new_ptr(&ZCG(xlat_table), key, (void*)new);
 }
 
 void *zend_shared_alloc_get_xlat_entry(const void *old)
 {
        void *retval;
+       zend_ulong key = (zend_ulong)old;
 
-       if ((retval = zend_hash_index_find_ptr(&ZCG(xlat_table), (zend_ulong)old)) == NULL) {
+       key = (key >> 3) | (key << ((sizeof(key) * 8) - 3)); /* key  = _rotr(key, 3);*/
+       if ((retval = zend_hash_index_find_ptr(&ZCG(xlat_table), key)) == NULL) {
                return NULL;
        }
        return retval;