spl_object_hash объекта после сериализации

Serguitar

Новичок->продвинутый
spl_object_hash объекта после сериализации

PHP:
class a {
	protected $_a;
	public function __construct($a) {
		$this->_a = $a;
	}
}
$a1 = new a(15);
var_dump(spl_object_hash($a1)); // string(32) "4f827a136072556b523b988c906b55cb"
$b = $a1;
var_dump(spl_object_hash($b));  // string(32) "4f827a136072556b523b988c906b55cb"
$c = serialize($a1);
$a2 = unserialize($c);
var_dump(spl_object_hash($a2)); // string(32) "01660920c14a2ca8a9c57130126ccd07"
Почему хеш меняется после се/ансе/риализации?
Не могу понять.
 

korchasa

LIMB infected
Serguitar
Он вроде на смещение в таблице объектов завязан. Т.е. он характеризует не состояние объекта, а сам инстанс.

-~{}~ 10.02.10 19:24:

PHP:
<?php
class a { 
    protected $_a; 
    public function __construct($a) { 
        $this->_a = $a; 
    } 
    public function setA($value) {
        $this->_a = $value;
    }   
} 
$a1 = new a(15); 
var_dump(spl_object_hash($a1));

$b = $a1; 
var_dump(spl_object_hash($b)); 

$c = serialize($a1); 
$a2 = unserialize($c); 
var_dump(spl_object_hash($a2));

$a2->setA(1);
var_dump(spl_object_hash($a2));
-~{}~ 10.02.10 19:25:

string(32) "000000001d956bd6000000007676fb20"
string(32) "000000001d956bd6000000007676fb20"
string(32) "000000001d956bd5000000007676fb20"
string(32) "000000001d956bd5000000007676fb20"
 

Serguitar

Новичок->продвинутый
Странно, у меня другие хеши.
PHP:
<?php
class a { 
    protected $_a; 
    public function __construct($a) { 
        $this->_a = $a; 
    } 
    public function setA($value) {
        $this->_a = $value;
    }   
} 
$a1 = new a(15); 
var_dump(spl_object_hash($a1)); // string(32) "4f827a136072556b523b988c906b55cb"

$b = $a1; 
var_dump(spl_object_hash($b)); // string(32) "4f827a136072556b523b988c906b55cb"

$c = serialize($a1); 
$a2 = unserialize($c); 
var_dump(spl_object_hash($a2)); // string(32) "01660920c14a2ca8a9c57130126ccd07"

$a2->setA(1);
var_dump(spl_object_hash($a2)); // string(32) "01660920c14a2ca8a9c57130126ccd07"
 

Вурдалак

Продвинутый новичок
Автор оригинала: korchasa
string(32) "000000001d956bd6000000007676fb20"
string(32) "000000001d956bd6000000007676fb20"
string(32) "000000001d956bd5000000007676fb20"
string(32) "000000001d956bd5000000007676fb20"
— странно, вроде бы должны первые 2 и последние 2 совпадать.
 

Serguitar

Новичок->продвинутый
Автор оригинала: Вурдалак
— странно, вроде бы должны первые 2 и последние 2 совпадать.
Вопрос все равно открыт:
почему меняется хеш после се/ансе/риализации?

Я может что-то не так понимаю.
Я пытаюсь сравнивать два больших объекта с помощью этих хешей.
Может есть другие способы?
 

Вурдалак

Продвинутый новичок
Хеш берётся в моём представлении от какого-то внутренного значения, типа его адреса в памяти. От содержимого объекта хеш зависить не должен. А unserliaze() тебе другой объект выдаёт.
 

korchasa

LIMB infected
Автор оригинала: Serguitar
Вопрос все равно открыт:
почему меняется хеш после се/ансе/риализации?
Он и должен меняться, т.к. это другая инстанция объекта. Этот хэш равный у объектов, для которых === равен true.

Автор оригинала: Serguitar
Я может что-то не так понимаю.
Я пытаюсь сравнивать два больших объекта с помощью этих хешей.
Может есть другие способы?
А что является критерием? Данные внутри объекта?
 

Serguitar

Новичок->продвинутый
Спасибо за помощь, то, что не подходил, я уже понял и по другому тоже уже сделал. :)
Но этот момент записал и решил спросить, чтобы так сказать, не было сомнений.
Всем спасибо.
 

Вурдалак

Продвинутый новичок

Serguitar

Новичок->продвинутый
Мне показалось, что хеши сравнивать проще с точки зрения производительности, чем большие объекты.
 

Вурдалак

Продвинутый новичок
Автор оригинала: korchasa
Часто в объектах не все данных значащие.
— судя по начальным его попыткам вычислить хеш от всего объекта в целом, ему нужно учитывать именно все данные. Хотя дело его.
 
Сверху