<?php namespace goodboyalex\php_components_pack\classes; use goodboyalex\php_components_pack\enums\HashGetType; use goodboyalex\php_components_pack\extensions\StringExtension; use goodboyalex\php_components_pack\interfaces\ISerializable; /** * Класс для работы с хэшем файла или строки. * * @author Александр Бабаев * @package php_components_pack * @version 1.0.1 * @since 1.0.5 */ final class FileHash implements ISerializable { /** * @var string $Hash Хэш файла. */ private(set) string $Hash; /** * Конструктор. * * @param string $str Хэщ, строка или имя файла. * @param HashGetType $hashBy Тип получения хэша. */ public function __construct (string $str = "", HashGetType $hashBy = HashGetType::ByHash) { $this->Hash = match ($hashBy) { HashGetType::ByString => $this->pGetHash($str), HashGetType::ByFile => $this->pGetFileHash($str), HashGetType::ByHash => $str }; } /** * Получение хэша файла по строке. * * @param string $str Строка. * * @return string Хэш строки. */ private function pGetHash (string $str): string { return hash('sha256', $str); } /** * Получение хэша файла по имени файла. * * @param string $fileName Имя файла. * * @return string Хэш файла. */ private function pGetFileHash (string $fileName): string { return hash_file('sha256', $fileName); } /** * Сравнивает текущий хэш с хэшем <code>otherHash</code> и выдаёт <code>true</code>, если совпадают, и * <code>false</code>, если не совпадают. * * @param FileHash $otherHash Другой хэш. * * @return bool <code>true</code>, если совпадают, и <code>false</code>, если не совпадают. */ public function IsEqual (FileHash $otherHash): bool { return StringExtension::Compare($this->Hash, $otherHash->Hash, true) === 0; } /** * Проверяет, совпадает ли хэш с хэшем/файлом/строкой <code>str</code>. * * @param string $str Хэш, строка или имя файла. * @param HashGetType $hashBy Тип получения хэша. * * @return bool <code>true</code>, если совпадают, и <code>false</code>, если не совпадают. */ public function Validate (string $str, HashGetType $hashBy): bool { return match ($hashBy) { HashGetType::ByString => $this->pGetHash($str) == $this->Hash, HashGetType::ByFile => $this->pGetFileHash($str) == $this->Hash, HashGetType::ByHash => $str == $this->Hash, }; } /** * @inheritDoc */ public function Serialize (): string { return serialize($this->Hash); } /** * @inheritDoc */ public function UnSerialize (string $serialized): void { $this->Hash = unserialize($serialized); } }