Доброе времени суток! Проводя оптимизацию кода по рекомендациям blackfire.io дошел до пункта "YAML parsing should be cached in production" и вот я решил значит в своей обвёртке над YAML::decode добавить кеширование для всего что обрабатывается Yaml парсером, а в качестве названия ключа использую хеш контента. Код (Text): public function decode(string $input) { $key = md5($input); if ($this->flextype['cache']->contains($key)) { return $this->flextype['cache']->fetch($key); } else { $res = YamlParser::decode($input); $this->flextype['cache']->save($key, $res); return $res; } } Тестирую уже который день подряд и не вижу проблем с текущими данными и с новыми тоже, вроде бы все работает отлично. Одинаковый контент хранится под одним ключом, а если разный или новый, то хранится он под новым ключем. Я не совсем уверен в том что можно ли использовать хеш контента в качестве названия ключа и не вылезет ли это проблемой в будущем ? или все же стоит использовать более осмысленное именование ключей - передавая их название отдельным параметром в метод public function decode ?
@Awilum, честно говоря хеш для обеспечения уникальности кеша используется достаточно часто. Если боишься коллизий, то выбери один два параметра которые меняются чаще всех (имеют большое количество вариантов) и просто сделай их конкатенацию с общим хешем.
Наверное не совсем меня поняли. Я не про md5 хеширование. Я про то что правильно ли получать название это ключа на основе контента который сохраняем в кеш. Да коллизии будут но такие ли они опасны ? все равно же редактируем потом реальный контент а не из хеша, хмм... например будет так - две разные страницы сайта с одинаковым контентом будут храниться под одним названием ключа, так как контент у них одинаковый
Речь о том, что два разных контента могут храниться под одним ключом - в этом и есть коллизия. Но возможность такого случая крайне мала. я же написал, что так делают очень (очень, очень) часто. Другой момент, что много хорошего тоже плохо. И когда кеша очень много, то это плохо. Поэтому кешируют не всё подряд, а что-то "тяжёлое" и редко изменяемое. А так же необходимо унифицировать кеш (например добавить в него несколько больше информации, чем требуется в конкретном случае) и который легко можно модифицировать для частного случая, отбросив лишнюю инфу или изменив некоторые параметры.
окей, надо подумать еще раз. Кстати теперь вопрос, какой генерацией хеша будет быстрее пользоваться и вот нашел это сравнение https://code.google.com/archive/p/xxhash/ https://cyan4973.github.io/xxHash/
Ну вообще это звучит странно. Как ты будешь извлекать кеш? Придётся сначала извлечь контент, чтобы получить хэш, чтобы извлечь кэш?
Вот так я делал раньше: 1. Загружаю контент YAML файла (название то мне известно его) в строковую переменную file_get_contents 2. Передаю переменную с YAML контентом в decode() который переводит YAML в массив 3. Отображаю контент массив который мне вернул decode() Сейчас так: 1. Загружаю контент YAML файла (название то мне известно его) в строковую переменную file_get_contents 2. Передаю переменную с YAML контентом в decode() 2.1. Получаю ключ на основе контента, который был передан вот так $key = md5($input); 2.2. Если ключ есть в Кеше, тогда берем уже сохранённый массив в Кеше иначе парнем YAML контент, сохраняем его с ключом $key = md5($input); и возвращаем массив. 3. Отображаю контент массив который мне вернул decode() PHP: public function decode(string $input) { $key = md5($input); if ($this->flextype['cache']->contains($key)) { return $this->flextype['cache']->fetch($key); } else { $res = YamlParser::decode($input); $this->flextype['cache']->save($key, $res); return $res; } } если не кешировать по ключу, который основан на контенте, тогда надо передавать осмысленное название ключа и собственно к Кешу тогда наверное обращаться на более высшем уровне по всему коду, там где вызывается decode() но вроде как операций с файловой системой во втором варианте больше выходит... но backfire показывает что благодаря тому что не приходится каждый раз прогонять данные через YAML парсер, то производительность выростает в разы
Не стоит кидать такие заявления. Смотрим документацию 2 ** 32 = 4294967296 это очень маленькое число для перебора достаточно легко сгенерировать все варианты $input
Вы перепутали шестнадцатиричные символы с битами. md5 - это 128 бит. Но вы правы в том, что алгоритм очень лёгкий для современных компьютеров. Это даже плюс, если речь идёт не о пароле.