2014-01-20 55 views
3

我需要清楚地標識一個對象並將其標識存儲在我的數據庫中。 之後我需要這個ID來恢復這個對象。對象的真實和穩定散列

我試過使用「spl_object_hash()」(http://php.net/manual/en/function.spl-object-hash.php),但是這個函數每次重新加載頁面時都會返回一個值。

爲了進行測試,這是物體穩定,保持不變,完全不變。永遠不要少「spl_object_hash()」一次又一次地返回不同的結果我會重新加載。

$foo = new stdClass(); 
print_r(spl_object_hash($foo)); 

- >另一個哈希每次我打一次刷新

我需要一種方法來創建依賴於完整的對象的哈希值。只要對象不存在,這個散列就不應該改變。

我不希望實現一個自己的方法(只要沒有其他可能解決我的問題)這一點,因爲我需要一個快速,簡單和統一的方式,以確定我的對象。

進一步我不想使用會話用於此目的。

所以我能做些什麼來解決這個問題?

感謝提前&友好的問候!

+0

一個簡單的md5(serialize($ foo)); –

+0

*「請注意,對象的內容(屬性)不被函數散列,僅僅是其內部句柄和處理程序表指針,這足以保證同時駐留在內存中的任何兩個對象將具有不同的散列。在沒有同時駐留在內存中的對象之間無法保證。「* - 在[documentation]中的第一條評論(http://www.php.net/manual/en/function.spl-object-hash.php#76220) 。推斷是這個函數不是爲了在會話之間爲一個對象產生相同的結果而設計的。 – Emissary

+0

@ Jens-AndréKoch:哇,這完全是我需要的,它讓我感到很尷尬,我沒有按自己的方式來到這裏。萬分感謝! – serjoscha

回答

3

您可以使用序列化調用(與被覆蓋的__sleep()魔喚)序列化對象,以獲得一個唯一的哈希:

$hash = md5(serialize($myObject)); 

加在存儲一些額外數據(如PDO處理程序,文件句柄)的對象中,您可以覆蓋__sleep()和__wakeup()方法來獲取/設置唯一的對象數據,例如代碼http://www.php.net/manual/en/language.oop5.magic.php#object.sleep

<?php 
class Connection 
{ 
    protected $link; 
    private $dsn, $username, $password; 

    public function __construct($dsn, $username, $password) 
    { 
     $this->dsn = $dsn; 
     $this->username = $username; 
     $this->password = $password; 
     $this->connect(); 
    } 

    private function connect() 
    { 
     $this->link = new PDO($this->dsn, $this->username, $this->password); 
    } 

    public function __sleep() 
    { 
     return array('dsn', 'username', 'password'); 
    } 

    public function __wakeup() 
    { 
     $this->connect(); 
    } 
}?> 

這應該給你的對象一個散列,甚至更好,你可以配置你想用它來創建哈希哪些字段。

+0

謝謝。這正是Jens-AndréKoch先前建議的。它正是我一直在尋找的。 – serjoscha

0

你總是可以做到這一點:

function object_hash($object, $algorithm = 'md5') { 
    $serialized_object = serialize($foo); 

    return hash($algorithm, $serialized_object); 
} 

$foo = new stdClass(); 
print_r(object_hash($foo)); 
+0

這就是我不想做的。我也可以在我的課程中添加一個Method,它返回一個完全唯一的ID,但我不想寫一個我自己的方法來儘可能保持最小的一切。這就是爲什麼我正在尋找一種快速的單線方式。 – serjoscha

+0

@serjoscha - 但添加一個方法類也是非常好的選擇。您可以使用一種方法「getUniqueID()」創建一個名爲let say「IUniqueIdentifierProvider」的接口,然後在所有對象中可以預期IUniqueIdentifierProvider實例。 這會爲您的項目增加很多清晰度,並幫助您維護代碼依賴關係。 – PolishDeveloper