2012-01-09 61 views
10

我正在做某些查詢的sql緩存。我使用CakePHP所以查詢條件是一個數組這樣的:獲取多維數組校驗和的最簡潔方法是什麼?

array (
    0 => 
    array (
    0 => 'Tutorial.id IN (SELECT tutorial_id FROM classifications WHERE classifications.product_id = 1) ', 
), 
    1 => 
    array (
    'Tutorial.status_id ' => 
    array (
     0 => 4, 
     1 => 7, 
    ), 
), 
    'OR' => 
    array (
    'Tutorial.user_id' => '40', 
), 
); 

我主要找的product_id,但也有一些其他可能的條件,所以我想在陣列降低到校驗和將其附加到緩存文件的名稱。這樣我就有了tutorials_by_classification-413a86af之類的東西,我不必挑選數組。

我已經看到了在php.net in the comments上爆裂多個數組的函數,但我想知道是否有更簡單的方法來實現我的目標。

回答

15

serializemd5怎麼樣? serialize創建數組的字符串表示形式; md5創建它的散列。

例子:

$query = array (
    0 => 
    array (
    0 => 'Tutorial.id IN (SELECT tutorial_id FROM classifications WHERE classifications.product_id = 1) ', 
), 
    1 => 
    array (
    'Tutorial.status_id ' => 
    array (
     0 => 4, 
     1 => 7, 
    ), 
), 
    'OR' => 
    array (
    'Tutorial.user_id' => '40', 
), 
); 

$query_string = serialize($query); 
$hash = md5($query_string); 

echo $query_string, "\n\n\n", $hash, "\n"; 

/* 
a:3:{i:0;a:1:{i:0;s:96:"Tutorial.id IN (SELECT tutorial_id FROM classifications WHERE classifications.product_id = 1) ";}i:1;a:1:{s:19:"Tutorial.status_id ";a:2:{i:0;i:4;i:1;i:7;}}s:2:"OR";a:1:{s:16:"Tutorial.user_id";s:2:"40";}} 


a5cb59f0ee259961e426c7ce9b7b8f32 
*/ 
+0

謝謝,正是我所需要的!我最終使用crc32作爲哈希,因爲它使文件名更短http://codepad.org/LhTotSth。 – 2012-01-10 14:54:12

10

我只是這樣做:

$checksum = md5(json_encode($array)); 

json_encode略大於連載快,但你失去了一些連載的好處。但是,對於你正在做的事情,這並不重要。

+0

「json_encode稍快於序列化」。根據我的基準測試結果,這不是 - 它慢了大約30%。 (但他們都很快,所以這可能不是一個問題。) – lonesomeday 2012-01-09 22:40:33

+0

根據這個:https://bugs.php.net/bug.php?id = 51267我想這取決於你是否數組是嵌套的。 – 2012-01-09 23:25:49

+0

我的陣列太簡單了,不能顯示這個,或者bug已經修復... – lonesomeday 2012-01-10 00:06:52

相關問題