PHP spl_object_hash 不同对象hash_code一样的原因

lys2020年09月29日 0条评论

spl_object_hash 的一个坑,hash一样以为是同一个对象的,原来地址使用了同一个,前面的被释放掉了,做一个笔记

<?php
class User
{
    public $id = '';
    public $name = '';
 
    public function __construct($name = '')
    {
        $this->name = $name;
        $this->id = spl_object_hash($this);
    }
}
 
$user1 = new User('blogdaren');
$user2 = new User('blogdaren');
 
$t1 = spl_object_hash(new User('blogdaren'));
$t2 = spl_object_hash(new User('blogdaren'));
 
//1. $user1->id !== $user2->id, it seems to be ok.
//2. $t1 === $t2, it seems to be equal, so why?
var_dump($user1->id, $user2->id, $user1->id === $user2->id, $t1, $t2, $t1 === $t2);

spl_object_hash()函数疑惑:

(1)$user1->id  !== $user2->id  不相等,这符合预期。

(2)14-15行代码、17-18行代码,前后分别 new 同一个对象的四个不同实例,为什么 $t1 === $t2 恒相等?表示不理解。

因为 spl_object_hash 函数是根据同一内存位置不可能存在两个对象,这个原理作为散列依据。
第17行执行后 User 对象生命周期结束,被内核作为垃圾回收,其内存空间很有可能被第18行的语句占用。
也就是说先后两个 User 虽然属于不同对象,但是他们在不同的时间占用了相同的内存位置。而 spl_object_hash 函数是根据内存位置计算散列值的,所以会出现两个对象的哈希值一样的情况。

参考原文如下:

http://php.net/manual/zh/function.spl-object-hash.php#76220

http://www.blogdaren.com/post-2482.html?from=groupmessage