From: Etienne Kneuss Date: Mon, 26 Jan 2009 11:38:03 +0000 (+0000) Subject: MFH: Improve spl_object_hash() X-Git-Tag: php-5.3.0beta1~22 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e094d1aa44330f006ff9d2c44220a84244871c1d;p=php MFH: Improve spl_object_hash() --- diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c index 899b3e04ae..0406bb4414 100755 --- a/ext/spl/php_spl.c +++ b/ext/spl/php_spl.c @@ -39,7 +39,9 @@ #include "spl_heap.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) @@ -669,34 +671,41 @@ PHP_FUNCTION(spl_autoload_functions) 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); } /* }}} */ @@ -844,6 +853,7 @@ PHP_RINIT_FUNCTION(spl) /* {{{ */ SPL_G(autoload_extensions) = NULL; SPL_G(autoload_extensions_len) = 0; SPL_G(autoload_functions) = NULL; + SPL_G(hash_mask_init) = 0; return SUCCESS; } /* }}} */ @@ -859,6 +869,9 @@ PHP_RSHUTDOWN_FUNCTION(spl) /* {{{ */ 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; } /* }}} */ diff --git a/ext/spl/php_spl.h b/ext/spl/php_spl.h index c1e623f0b1..f2e0c65181 100755 --- a/ext/spl/php_spl.h +++ b/ext/spl/php_spl.h @@ -62,6 +62,9 @@ ZEND_BEGIN_MODULE_GLOBALS(spl) HashTable * autoload_functions; int autoload_running; int autoload_extensions_len; + intptr_t hash_mask_handle; + intptr_t hash_mask_handlers; + int hash_mask_init; ZEND_END_MODULE_GLOBALS(spl) #ifdef ZTS