colder Mon Jan 26 11:37:50 2009 UTC Modified files: /php-src/ext/spl php_spl.c php_spl.h Log: Improve spl_object_hash() http://cvs.php.net/viewvc.cgi/php-src/ext/spl/php_spl.c?r1=1.149&r2=1.150&diff_format=u Index: php-src/ext/spl/php_spl.c diff -u php-src/ext/spl/php_spl.c:1.149 php-src/ext/spl/php_spl.c:1.150 --- php-src/ext/spl/php_spl.c:1.149 Wed Dec 31 11:12:36 2008 +++ php-src/ext/spl/php_spl.c Mon Jan 26 11:37:46 2009 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_spl.c,v 1.149 2008/12/31 11:12:36 sebastian Exp $ */ +/* $Id: php_spl.c,v 1.150 2009/01/26 11:37:46 colder Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -39,7 +39,9 @@ #include "spl_fixedarray.h" #include "zend_exceptions.h" #include "zend_interfaces.h" -#include "ext/standard/md5.h" +#include "ext/standard/php_rand.h" +#include "ext/standard/php_lcg.h" +#include "main/snprintf.h" #ifdef COMPILE_DL_SPL ZEND_GET_MODULE(spl) @@ -689,34 +691,41 @@ PHP_FUNCTION(spl_object_hash) { zval *obj; - char* md5str; + char* hash; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &obj) == FAILURE) { return; } - md5str = emalloc(33); - php_spl_object_hash(obj, md5str TSRMLS_CC); + hash = emalloc(33); + php_spl_object_hash(obj, hash TSRMLS_CC); - RETVAL_STRING(md5str, 0); + RETVAL_STRING(hash, 0); } /* }}} */ -PHPAPI void php_spl_object_hash(zval *obj, char *md5str TSRMLS_DC) /* {{{*/ +PHPAPI void php_spl_object_hash(zval *obj, char *result TSRMLS_DC) /* {{{*/ { - int len; - char *hash; - PHP_MD5_CTX context; - unsigned char digest[16]; - - len = spprintf(&hash, 0, "%p:%d", Z_OBJ_HT_P(obj), Z_OBJ_HANDLE_P(obj)); - - md5str[0] = '\0'; - PHP_MD5Init(&context); - PHP_MD5Update(&context, (unsigned char*)hash, len); - PHP_MD5Final(digest, &context); - make_digest(md5str, digest); - efree(hash); + intptr_t hash_handle, hash_handlers; + char *hex; + + if (!SPL_G(hash_mask_init)) { + if (!BG(mt_rand_is_seeded)) { + php_mt_srand(GENERATE_SEED() TSRMLS_CC); + } + + SPL_G(hash_mask_handle) = (intptr_t)(php_mt_rand(TSRMLS_C) >> 1); + SPL_G(hash_mask_handlers) = (intptr_t)(php_mt_rand(TSRMLS_C) >> 1); + SPL_G(hash_mask_init) = 1; + } + + hash_handle = SPL_G(hash_mask_handle)^(intptr_t)Z_OBJ_HANDLE_P(obj); + hash_handlers = SPL_G(hash_mask_handlers)^(intptr_t)Z_OBJ_HT_P(obj); + + spprintf(&hex, 32, "%016x%016x", hash_handle, hash_handlers); + + strlcpy(result, hex, 33); + efree(hex); } /* }}} */ @@ -865,6 +874,8 @@ ZVAL_ASCII_STRINGL(&SPL_G(autoload_extensions), ".inc,.php", sizeof(".inc,.php")-1, 1); SPL_G(autoload_functions) = NULL; SPL_G(autoload_running) = 0; + SPL_G(autoload_running) = 0; + SPL_G(hash_mask_init) = 0; return SUCCESS; } /* }}} */ @@ -879,6 +890,9 @@ FREE_HASHTABLE(SPL_G(autoload_functions)); SPL_G(autoload_functions) = NULL; } + if (SPL_G(hash_mask_init)) { + SPL_G(hash_mask_init) = 0; + } return SUCCESS; } /* }}} */ http://cvs.php.net/viewvc.cgi/php-src/ext/spl/php_spl.h?r1=1.28&r2=1.29&diff_format=u Index: php-src/ext/spl/php_spl.h diff -u php-src/ext/spl/php_spl.h:1.28 php-src/ext/spl/php_spl.h:1.29 --- php-src/ext/spl/php_spl.h:1.28 Wed Dec 31 11:12:36 2008 +++ php-src/ext/spl/php_spl.h Mon Jan 26 11:37:46 2009 @@ -61,6 +61,9 @@ zval autoload_extensions; HashTable * autoload_functions; int autoload_running; + intptr_t hash_mask_handle; + intptr_t hash_mask_handlers; + int hash_mask_init; ZEND_END_MODULE_GLOBALS(spl) #ifdef ZTS
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php