Krzysztof N.

Krzysztof N. CEO. Aplikacje
internetowe i
mobilne. Symfony,
Zend.

Temat: spl_object_hash() - taki sam hash dla różnych obiektów?

Taka sytuacja:
$original = new My\Namespace\MyObject();

$object1 = clone $original;
$object2 = clone $original;

$hash1 = spl_object_hash($object1);
$hash2 = spl_object_hash($object2);
Dlaczego $hash1 i $hash2 są identyczne?
lub inaczej:
Kiedy, w jakich przypadkach, $hash1 i $hash2 mogą być identyczne?

Bazując na dokumentacji funkcji spl_object_hash()
wiemy, że:
When an object is destroyed, its hash may be reused for other objects.
oraz że:
Uniqueness is not guaranteed between objects that did not reside in memory simultaneously, for example:
var_dump(spl_object_hash(new stdClass()), spl_object_hash(new stdClass()));
tylko to nie rozwiązuje problemu.

Jakie macie pomysły? :]

konto usunięte

Temat: spl_object_hash() - taki sam hash dla różnych obiektów?

Sprawdź na kilku różnych wersjach PHP :)
Tomasz Zadora

Tomasz Zadora programuję

Temat: spl_object_hash() - taki sam hash dla różnych obiektów?

Być może wykryłeś bug-a którego warto zgłosić. Na https://bugs.php.net/ nic nie ma na ten temat.Ten post został edytowany przez Autora dnia 17.06.14 o godzinie 20:49

konto usunięte

Temat: spl_object_hash() - taki sam hash dla różnych obiektów?

A czy to nie jest tak, że obiekt klonowany to nic innego jak referencja do oryginału, stąd ten sam hash?
Krzysztof N.

Krzysztof N. CEO. Aplikacje
internetowe i
mobilne. Symfony,
Zend.

Temat: spl_object_hash() - taki sam hash dla różnych obiektów?

Piotr L.:
A czy to nie jest tak, że obiekt klonowany to nic innego jak referencja do oryginału, stąd ten sam hash?
Tylko w sytuacji, gdy nie przypiszesz do zmiennych. Zobacz:

1. Kawał kodu:
/*
* The same ojects assigned to variable
*/
$o1 = new stdClass();
$o2 = new stdClass();

$h1 = spl_object_hash($o1);
$h2 = spl_object_hash($o2);

var_dump('------ The same ojects assigned to variable ------', $h1, $h2, $h1 == $h2);

/*
* Cloned ojects
*/
$o3 = new stdClass();
$o4 = clone $o3;

$h3 = spl_object_hash($o3);
$h4 = spl_object_hash($o4);

var_dump('------ Cloned ojects ------', $h3, $h4, $h3 == $h4);

/*
* The same ojects NOT assigned to variable
*/
$h4 = spl_object_hash(new stdClass());
$h5 = spl_object_hash(new stdClass());

var_dump('------ The same ojects NOT assigned to variable ------', $h4, $h5, $h4 == $h5);
2. Wynik po uruchomieniu:
string '------ The same ojects assigned to variable ------' (length=50)
string '000000005dc2685d0000000076c3d625' (length=32)
string '000000005dc2685e0000000076c3d625' (length=32)
boolean false

string '------ Cloned ojects ------' (length=27)
string '000000005dc2685f0000000076c3d625' (length=32)
string '000000005dc268580000000076c3d625' (length=32)
boolean false

string '------ The same ojects NOT assigned to variable ------' (length=54)
string '000000005dc268590000000076c3d625' (length=32)
string '000000005dc268590000000076c3d625' (length=32)
boolean true
Krzysztof N.

Krzysztof N. CEO. Aplikacje
internetowe i
mobilne. Symfony,
Zend.

Temat: spl_object_hash() - taki sam hash dla różnych obiektów?

Doprecyzowanie.
Sprawa tyczy się konkretnie obiektów tej samej klasy tworzonych w pętli:
for ($i = 0; $i < 6; $i++) {
$object = new stdClass();
$hash = spl_object_hash($object);
var_dump($hash);
}
Wynik po uruchomieniu - co drugi hash jest identyczny (o kurka wodna):
string '0000000041c9c2f60000000000b9c7f5' (length=32)
string '0000000041c9c2f50000000000b9c7f5' (length=32)
string '0000000041c9c2f60000000000b9c7f5' (length=32)
string '0000000041c9c2f50000000000b9c7f5' (length=32)
string '0000000041c9c2f60000000000b9c7f5' (length=32)
string '0000000041c9c2f50000000000b9c7f5' (length=32)
Uwaga.
Problem znika po dodaniu tablicy, do której ładowane są hashe i obiekty, w poniższym przykładzie jest to $hashes:
$hashes = array();

for ($i = 0; $i < 6; $i++) {
$object = new stdClass();
$hash = spl_object_hash($object);
var_dump($hash);
$hashes[$hash] = $object;
}

var_dump($hashes);
Wynik po uruchomieniu - każdy hash jest unikalny:
string '000000000ea2da2b000000000ced6496' (length=32)
string '000000000ea2da28000000000ced6496' (length=32)
string '000000000ea2da29000000000ced6496' (length=32)
string '000000000ea2da2e000000000ced6496' (length=32)
string '000000000ea2da2f000000000ced6496' (length=32)
string '000000000ea2da2c000000000ced6496' (length=32)

array (size=6)
'000000000ea2da2b000000000ced6496' =>
object(stdClass)[1]
'000000000ea2da28000000000ced6496' =>
object(stdClass)[2]
'000000000ea2da29000000000ced6496' =>
object(stdClass)[3]
'000000000ea2da2e000000000ced6496' =>
object(stdClass)[4]
'000000000ea2da2f000000000ced6496' =>
object(stdClass)[5]
'000000000ea2da2c000000000ced6496' =>
object(stdClass)[6]
O co tu chodzi? :]

konto usunięte

Temat: spl_object_hash() - taki sam hash dla różnych obiektów?

Magic! Takie rzeczy to się nawet fizjologom nie śniły ;)



Wyślij zaproszenie do