簡體   English   中英

使用php為給定的字符串生成唯一的ID

[英]Generating a unique id for a given string using php

我正在使用Zend_Cache_Core和Zend_Cache_Backend_File來緩存針對訪問數據庫的模型類執行的查詢的結果。

基本上,查詢本身應該形成用於緩存獲得的結果的ID,唯一的問題是它們太長了。 Zend_Cache_Backend_File不會引發異常,PHP不會抱怨,但是不會創建緩存文件。

我想出了一個效率極低的解決方案,將執行的所有查詢以及自動遞增的ID都存儲在單獨的文件中,如下所示:

0->> SELECT * FROM表1->> SELECT * FROM table1,table2 2->> SELECT * FROM表WHERE foo = bar

你明白了。 這樣,我對每個查詢都有唯一的ID。 每當完成插入,刪除或更新時,我都會清理緩存。

現在,我確定您在這里看到了潛在的瓶頸,對於任何測試,保存或從高速緩存中獲取或讀取都會對文件系統發出兩個(或三個,我們需要在其中添加新的ID)請求。 這甚至可以消除全部緩存的需求。 那么,有沒有一種方法可以生成php中查詢的唯一ID(即更短的表示形式)而不必將其存儲在文件系統或數據庫中?

字符串任意長,因此顯然不可能創建一個固定大小的標識符來表示任意輸入字符串而無需重復。 但是,出於緩存的目的,通常可以避免使用一種簡單的“足夠好”的解決方案,並將沖突減少到可接受的水平。

例如,您可以簡單地使用MD5,它只會在2 128種情況下發生1次碰撞。 如果您仍然擔心沖突(為了安全起見,您可能應該這樣做),則可以將查詢結果存儲在緩存的“值”中,並檢查何時將值取回,它實際上是查詢您正在尋找。

舉個簡單的例子(我的PHP有點生銹,但是希望您能理解):

$query = "SELECT * FROM ...";

$key = "hash-" + hash("md5", $query);
$result = $cache->load($key);
if ($result == null || $result[0] != $query) {
    // object wasn't in cache, do the real fetch and store it
    $result = $db->execute($query); // etc

    $result = array($query, $result);
    $cache->save($result, $key);
}

// the result is now in $result[1] (the original query is in $result[0])

MD5!

Md5生成一個長度為32的字符串,看起來似乎工作正常,創建了緩存文件(文件名的長度約為47),因此操作系統似乎不拒絕它們。

//returns id for a given query
function getCacheId($query) {
    return md5($query);
}

就是這樣! 但是那是沖突的問題,我認為對md5哈希(可能帶有表的名稱)添加鹽分應該使它更健壯。

//returns id for a given query
function getCacheId($query, $table) {
    return md5($table . $query);
}

如果有人想要我實現結果緩存的完整代碼,請發表評論,我很樂意將其發布。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM