You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib绘制SHA-256哈希整数直方图时出现TypeError问题求助

Matplotlib绘制SHA-256哈希整数直方图时出现TypeError问题求助

看起来你已经完成了作业的核心部分,就差最后一步的直方图绘制啦!这个错误其实很好解决,我来帮你拆解分析:

错误根源

你遇到的TypeError: ufunc 'isfinite' not supported for the input types,本质原因是SHA-256转换后的整数是256位的超大Python任意精度整数(数值范围在0到2^256-1之间)。Matplotlib的hist函数依赖numpy处理数据,而numpy无法直接识别这种超大的Python原生整数,导致用于校验数值有效性的isfinite函数无法处理该类型,最终抛出类型错误。

两种快速修复方案

方案1:将超大整数归一化到[0,1)区间(推荐)

把256位大整数除以2^256,转换成0到1之间的浮点数,这样numpy能完美处理,同时直方图的x轴会更直观(原始数值范围过大,直接展示没有实际参考意义)。

修改你的plot_histogram函数如下:

def plot_histogram(results, bins = 20):
    # 直接提取所有SHA-256对应的整数(无需重复转换或校验)
    integer_values = [val for _, _, val in results]
    # 归一化到0-1区间,解决超大整数的类型兼容问题
    normalized_values = [val / (2 ** 256) for val in integer_values]

    plt.figure(figsize=(10, 6))
    plt.hist(normalized_values, bins=bins, color='purple', edgecolor='black')
    plt.title(f'SHA-256整数归一化直方图({bins}个区间)')
    plt.xlabel('归一化后数值(0到1)')
    plt.ylabel('频数')
    plt.grid(axis='y', linestyle='--', linewidth=0.7, alpha=0.7)
    # 加个小注释帮助理解归一化的作用
    plt.figtext(0.5, 0.01, '注:将256位大整数除以2^256实现归一化,解决numpy无法处理超大整数的问题', ha='center', fontsize=8)
    plt.show()

方案2:利用numpy的uint256类型(需环境支持)

如果你的numpy版本≥1.20,它支持uint256无符号256位整数类型,可以直接转换后绘制直方图:

import numpy as np

def plot_histogram(results, bins = 20):
    # 转换为numpy支持的uint256类型
    integer_values = np.array([val for _, _, val in results], dtype=np.uint256)

    plt.figure(figsize=(10, 6))
    plt.hist(integer_values, bins=bins, color='purple', edgecolor='black')
    plt.title(f'SHA-256整数直方图({bins}个区间)')
    plt.xlabel('256位整数值')
    plt.ylabel('频数')
    # 开启科学计数法显示x轴,避免数值过长
    plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
    plt.grid(axis='y', linestyle='--', linewidth=0.7, alpha=0.7)
    plt.show()

额外小优化

你原来的plot_histogram函数里有一段冗余代码:

integer_values = [int(integer_value) for _, _, integer_value in results if isinstance(integer_value, int)]

这里的int(integer_value)强制转换和isinstance类型判断都是多余的——你的sha256_to_int函数返回的肯定是整数类型,直接提取即可。

把修改后的函数替换掉原来的版本,再运行代码就能正常生成直方图啦!

备注:内容来源于stack exchange,提问作者Sergio Gonzalez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:19:37