【计算机理论基础】停机问题(Halting Problem)

1 停机问题的来源

        Alan Turing: On Computable Numbers, with an Application to the Entscheidungsproblem 

        resource: https://people.math.ethz.ch/~halorenz/4students/Literatur/TuringFullText.pdf

        停机问题(Halting Problem):是否存在一个算法可以判断任意的程序是否会在有限时间内停止执行,还是会陷入无限循环?

2 为什么提出停机问题

        上一篇文章中,我们讲到了图灵机(Turing Machine),为什么需要将停机问题呢?我的理解是,这篇文章是图灵为了回答判定问题,判定问题就是“是否存在一个通用的算法或者方法,能够判断任何一个数学命题是真还是假的”,有了这个背景,我们再进行下一步理解。

        如果想要说明这个问题,我们首先可以看能不能找到哪些命题是不可以被回答的。然后图灵提出了图灵机的概念,并总结“任何可以计算的问题或者过程都可以通过图灵机来表达”,图灵机提供了一个定义“计算”或“算法”的精确方法,它能解决的问题被称为可计算问题。然后通过停机问题证明了“并非所有问题都可以由图灵机在有限时间内解决”,也就是说“存在不可解的问题(或者说图灵机不可解的问题)”。那么就是说“没有一种通用的算法,能够判断一个程序和输入是否会在有限的时间内停下来”,那么就是说“没有一种通用的算法或方法,能够判断一个命题是真或假”,从而便回答了“判定问题”。

3 怎么证明停机问题不可解

        图灵通过一种对角线论证归谬法来证明停机问题是不可解的。

        图灵假设有一个“判定器”可以决定任意图灵机是否会在给定输入下停机。为了证明这个问题不可解,图灵构造了一个特殊的图灵机 M,当这个机器接收到自身的描述作为输入时,会导致自我矛盾:

  1. 假设:存在一个通用的算法 H(M,x),该算法能够判定图灵机 M是否会在输入 x 上停机。

  2. 构造新的机器 D:该机器使用 H 作为子程序,它接受一个图灵机描述 M 作为输入并做如下操作:

    • 如果 H(M,M)返回“停机”,则D不停机,进入无限循环。
    • 如果 H(M,M)返回“不停机”,则D停机。
  3. 矛盾:现在将 D自己作为输入,即 D(D)。根据 H 的判定:

    • 如果 D(D) 停机,那么 H(D,D)必须返回“不停机”,但这与 D(D) 会停机相矛盾。
    • 如果 D(D) 不停机,那么 H(D,D)必须返回“停机”,但这与 ( D(D) 不停机相矛盾。

        因此,图灵得出结论,不可能存在这样的算法可以解决所有情况下的停机问题。这就是停机问题不可判定性的证明​。

        文章说明:本文第三部分内容来自大模型生成内容,笔者意在记录学习过程,最大的愿望是希望有理解更深层次的学者能够指导,说明这篇生成内容是否正确,并讲讲自己对该部分的理解,不胜感激!

<think>好的,我现在需要帮助用户了解中的_m_h5_tk参数的用途和生成方法。首先,我得回忆一下之前用户提供的引用内容,特别是引用[2]和[4],里面提到了这个参数是cookie中的一部分,用于生成sign值,而sign值用于请求的签名验证。 首先,确定用途。根据引用[2],_m_h5_tk是作为d.token参数参与sign值的生成,而sign值用于接口请求时的签名,可能是为了防止CSRF攻击或者确保请求的合法性。另外,引用[4]提到sign值是通过字符串拼接后加密得到的,猜测_m_h5_tk可能是一个动态令牌,用来增加签名的复杂性,防止重放攻击。 然后是生成方法。引用[2]提到这个参数在cookie中存在,并且会定时失效,这说明它可能由服务器生成并下发到客户端。通常这类参数可能包含时间戳、用户会话信息等,结合服务器端的密钥进行哈希生成。用户可能需要通过模拟登录或者保持会话来获取这个参数,但由于其定时失效,可能需要定期更新。 另外,引用[4]中讨论了sign的生成涉及多个参数,包括时间戳、appkey等,而_m_h5_tk作为其中一个参数,可能与其他参数拼接后进行MD5或其他加密算法处理。需要注意的是,生成sign的具体方法可能需要逆向分析JavaScript代码,找到加密函数的位置,如引用[4]提到的i函数。 用户可能需要具体的生成步骤,比如如何从cookie中获取_m_h5_tk,如何拼接参数,使用哪种加密算法等。不过,由于的反爬机制较强,直接逆向可能会遇到混淆或加密的代码,需要耐心分析。 总结下来,回答应包括用途和生成方法两部分,结合引用中的信息,说明_m_h5_tk在签名中的作用,生成方式涉及服务器下发,动态更新,以及参与加密的过程。同时提醒用户注意参数的有效期和反爬措施。</think>关于$_m_h5_tk$参数的用途及生成方法,结合技术实现分析如下: ### 一、$_m_h5_tk$核心用途 1. **接口签名验证**:作为生成签名(sign)的核心参数之一,用于校验请求合法性[^2][^4] 2. **身份会话标识**:包含用户登录态信息,与cookie中的其他参数共同维持会话状态[^2] 3. **动态安全校验**:配合时间戳参数实现请求时效性验证,防止重放攻击[^2] ### 二、生成机制解析 根据逆向分析结果[^2]: 1. **服务器生成**:由服务端生成并下发给客户端 2. **组成结构**: $$\_m_h5_tk = \text{md5}(uid + \_m_h5_tk\_enc + timestamp)$$ 其中$\_m_h5_tk\_enc$为服务端加密密钥 3. **有效期**: - 默认有效期30分钟 - 超过有效期需重新登录获取[^2] ### 三、技术实现要点 以Python实现为例: ```python def generate_sign(params, token): """ :param params: 请求参数字典 :param token: 从cookie获取的_m_h5_tk :return: 加密后的sign值 """ # 参数拼接格式参考[^4] sign_str = f'{token}_{params["appKey"]}_{params["t"]}_{params["data"]}' return hashlib.md5(sign_str.encode()).hexdigest() ``` ### 四、维护注意事项 1. **定时刷新机制**:需实现cookie自动续期 2. **分布式存储**:多节点爬虫需共享会话状态 3. **异常处理**:捕获`401`响应及时重新认证
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值