summaryrefslogtreecommitdiff
path: root/ext/spl/php_spl.c
diff options
context:
space:
mode:
authorEtienne Kneuss <colder@php.net>2009-01-26 11:38:03 +0000
committerEtienne Kneuss <colder@php.net>2009-01-26 11:38:03 +0000
commite094d1aa44330f006ff9d2c44220a84244871c1d (patch)
treee2961a42f5715443b7e4ebe025238028a887310e /ext/spl/php_spl.c
parentf946918fc69ba2a74309ebbc37d7c18432a96902 (diff)
downloadphp-git-e094d1aa44330f006ff9d2c44220a84244871c1d.tar.gz
MFH: Improve spl_object_hash()
Diffstat (limited to 'ext/spl/php_spl.c')
-rwxr-xr-xext/spl/php_spl.c51
1 files changed, 32 insertions, 19 deletions
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;
} /* }}} */