从数组/类中计算唯一的id

时间:2011-01-19 10:08:08

标签: php arrays object hash unique-id

我使用数据类来为我的数据提供模板,我想从数据类中的数据计算一个唯一的id,这样我就可以检查具有该数据的模板是否已经在缓存中,然后提供该版本。

所以从类数组中获取唯一id的函数可以帮助我

这样的事情有效,但相当昂贵 MD5化(serialize($ classdata))

我希望有一些功能可以在不序列化所有数据的情况下获取唯一ID,或者至少不需要在php中

提前致谢, 最好的,保罗

编辑: 我很快庆祝,唯一的id在当前情况下是相同的 重新启动相同的脚本会产生另一个id,然后当然不在缓存中 使用的测试文件:

<?php
class foo {}
$f = new foo;
print spl_object_hash($f);

更深入地解释

class template_data implements IteratorAggregate, ArrayAccess, Countable {

    private $_data;

    //some methods for the overloaded classes
    //

    //the getId function
    public function getId() {
        return hash('md5',serialize($this->_data));
    }

}

$t = new template('file');
$d = new template_data('some data');
$t->addData($d);
$t->display();

现在,如果提供给模板引擎的数据在缓存中,则使用该版本 防止必须重新解析数据集的模板

这是一个简单的template_data视图,它实际上是延迟加载并使用memcached dataid,所以数据实际上并没有被提取,直到它在模板中使用

3 个答案:

答案 0 :(得分:5)

您可以尝试spl_object_hash()

来自文档

  

此函数返回对象的唯一标识符。该id可以用作用于存储对象或用于识别对象的散列键。

答案 1 :(得分:2)

PHP不会创建在对象的执行之间持续存在的唯一ID,这意味着您将正确地生成所需的行为。因此,虽然对于问题没有好的答案,但我可以提出一些建议,以降低生成ID的成本。

首先,您可以使用json_encode而不是serialize。其次,您可以存储该值,以便多次调用该函数不会每次都重新序列化数据。

  

json_encode函数不仅比serialize快,而且还会产生一个较短的字符串作为输出。

     

http://cw-internetdienste.de/2015/05/04/serialize-vs-json_encode/

class template_data implements IteratorAggregate, ArrayAccess, Countable {

    private $_data;
    private $_id;

    //
    //some methods for the overloaded classes
    //

    //the getId function
    public function getId() {
        if(empty($this->_id))
            $this->_id = hash('md5',json_encode($this->_data));

        return $this->_id;
    }
}

最后;最好的解决方案可能是使用路由缓存模板的输出,或者参数作为唯一缓存键的基础而不是使用的单个数据集。

答案 2 :(得分:1)

为什么不查看并覆盖对象上的__toString()方法来获取和散列对象中的相关数据。

例如

class Object
{
    // Some vars
    public $name = "Jake";
    public $age = 26;
    public $dob = "1/1/10"

    // the toString method
    public function __toString()
    {
         return md5($this->name . $this->age . $this->dob);
    }
}

// Create new object
$object = new Object();

// echo the object, this automatically calls your __toString method
echo $object

在这种情况下,您不使用序列化,这是代价高昂的,而只是使用__toString()根据与对象一起存储的变量生成您自己的唯一ID。