<?php

namespace Application\Service\Extension\Helper;

class EncryptHelper
{
    /**
     * 生成MD5哈希值
     *
     * 该方法接受一个数据参数，可以是字符串或数组，并返回其MD5哈希值
     * 如果数据类型是字符串，直接返回其MD5哈希值
     * 如果数据类型是数组，将数组的每个键值对序列化后分批次更新到哈希上下文中，最后返回综合哈希值
     * 不支持的类型将抛出异常
     *
     * @param mixed $data 要生成MD5哈希值的数据，可以是字符串或数组
     * @return string MD5哈希值
     * @throws \Exception 如果数据类型既不是字符串也不是数组，则抛出异常
     */
    public static function md5($data): string
    {
        // 检查数据是否为字符串
        if (is_string($data)) {
            return md5($data);
        } elseif (is_array($data)) {
            // 初始化MD5哈希上下文
            $hashContext = hash_init('md5');
            // 遍历数组，将每个键值对序列化后分批次更新到哈希上下文中
            foreach ($data as $key => $value) {
                hash_update($hashContext, $key . serialize($value));  // 分批次加入键值
            }

            // 计算最终哈希
            return hash_final($hashContext);
        }

        // 如果数据类型既不是字符串也不是数组，抛出异常
        throw new \Exception('暂不支持的类型。');
    }
}