вычислить уникальный идентификатор из массива / класса - PullRequest
9 голосов
/ 19 января 2011

Я использую класс данных для подачи шаблонов своих данных, я хочу вычислить уникальный идентификатор из данных в классе данных, чтобы я мог проверить, все ли шаблоны с этими данными уже находятся в кэше, а затем обработать эту версию.

, поэтому функция для получения уникального идентификатора из массива класса помогла бы мне

что-то вроде этого работает, но довольно дорого md5 (serialize ($ classdata))

я надеюсь, что есть какая-то функция для получения уникального идентификатора без сериализации всех данных, или, по крайней мере, не в php

Заранее спасибо, лучше всего, Пол

редактировать: я отмечал в ближайшее время, уникальный идентификатор в текущем экземпляре остается таким же, перезапуск этого же скрипта создает другой идентификатор, который, конечно, не входит в кэш. Используется тестовый сценарий:

<?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 ]

5 голосов
/ 19 января 2011

Вы можете попробовать spl_object_hash ()

Из документов

Эта функция возвращает уникальный идентификатор для объекта. Этот идентификатор может использоваться в качестве хеш-ключа для хранения объектов или для идентификации объекта.

2 голосов
/ 22 февраля 2016

PHP не создает уникальные идентификаторы, которые сохраняются между выполнениями для объектов, это означает, что вы собираетесь правильно создать желаемое поведение. Поэтому, хотя на поставленный вопрос нет хорошего ответа, я могу дать несколько советов по сокращению затрат на изготовление ваших идентификаторов.

Сначала вы можете использовать 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;
    }
}

Наконец; Вероятно, лучшим решением будет кэширование выходных данных шаблона с использованием маршрута или аргументов в качестве основы для уникальных ключей кэша, а не отдельных используемых наборов данных.

1 голос
/ 20 января 2011

Почему бы не посмотреть и не переопределить метод __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() для генерации собственного уникального идентификатора на основе переменных, хранящихся в объекте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...