【每周一坑】校验文件哈希

简介: 我们经常看到软件的下载页面会注明这个软件的哈希值。可能你从没在意,但这其实是个蛮重要的东西,它可以用来验证你下载的软件是否被人动过手脚。

先说个通知,给参与了码上行动的同学:又一期展示学习成果的编程擂台活动开始了,即是练手的好机会,又能得到助教的全程支持,还可以得积分赢奖金。赶紧来报名吧!从课程首页进入活动或联系答疑群内助教参与。(可点击文末 阅读原文


之前的两届战况:


只学2个月编程能写出什么代码?他们表示:You can you code!


【编程擂台】第2季 - 又一批码上行动学员作品新鲜出炉(附学习感言)



今天要出的题目源自安全界大牛余弦的一篇文章:我是如何 Python 一句话校验软件哈希值的。@褚瑞 同学也在群里推荐了这个题目。


我们经常看到软件的下载页面会注明这个软件的哈希值。可能你从没在意,但这其实是个蛮重要的东西,它可以用来验证你下载的软件是否被人动过手脚。


Python 下载页面上标出的 MD5 Sum


早些时候 Mac 上爆出的 XCodeGhost 木马事件,引发的一个重要环节就是因为部分开发人员既没有从官方渠道下载,又没有验证软件哈希值,以至于使用了被植入代码的开发工具。


那么问题来了:


请用 Python 写一个小程序,用来计算指定文件的哈希值。


附加题:


可以指定哈希加密算法,并让程序尽可能简单易用。


虽然 Linux 和 Unix 有现成的验证哈希命令,Windows 也有类似软件。不过既然是练习嘛,自己做一遍,会让你对相关的概念有更清楚的认识。


期待各位同学提交解答。


提交代码可以使用 paste.ubuntu.com 或 codeshare.io 等代码分享网站,只需将代码复制上去保存,即可获得一个分享地址,非常方便。


往期问题可通过公众号菜单栏“课外辅导”栏目中进入查看。



【解答】验证哥德巴赫猜想


这道题要实现功能并不难。如果你以前写过判断质数的代码,那只要在其基础上多加一层循环,判断相加的两个数是否都是质数即可。


一个参考解答:


# -*- coding: utf-8 -*-
import math
def goldbach(num):
    # 断言 num 为偶数并且大于 2
    assert num % 2 == 0 and num > 2, 'num 应为偶数'
    # 仅找出一组数据
    for i in range(2, num):
        # 满足两数之和为 num 并且都为质数
        if is_prime(i) and is_prime(num-i):
            print('{0} 可由两个素数:{1} 和 {2} 组成'.format(num, i, num-i))
            break
def is_prime(num):
    # 判断 2 的倍数
    if num == 2:
        return True
    elif num % 2 == 0:
        return False
    # 判断 3 到 sqrt(num) + 1 的奇数
    sqrt_num = int(math.sqrt(num))
    for i in range(3, sqrt_num+1, 2):
        if num % i == 0:
            return False
    return True
goldbach(12345678)


输出:


12345678 可由两个素数 31 和 12345647 组成


附上两份同学提交的解答:


@张贺


遍历2以上N的平方根以下的每一个整数或奇数,是不是能整除N,并比较了两种方法耗时。


http://paste.ubuntu.com/24666659/


@徐大龙


遍历2以上N的平方根以下的每一个整数,是不是能整除N,写法简单易懂。


https://github.com/PeytonXu/learn-python/blob/master/cases/gold_bach/gold_bach.py


『码上行动』在线学习班正在开放中,详情请回复 码上行动 查看


近期文章推荐阅读:

喏,你们要的 PyCharm 快速上手指南

给伸手党的福利:Python 新手引导

只学2个月编程能写出什么代码?他们表示:You can you code!

如何用100行Python代码做出魔性声控游戏“八分音符酱”

数据分析:当赵雷唱民谣时他唱些什么?

一行代码扫出“敬业福”

我扒了杜蕾斯的微博

Python 爬虫爬取美剧网站

今天,你抢到票了吗?

爆款游戏《贪吃蛇大作战》的 Python 实现

相关文章
|
4月前
|
缓存 前端开发 JavaScript
前端优化之路:打包文件拆包、增加哈希值
前面对项目打包做了优化处理,但是还不够完美,有两点可继续优化。
|
存储 人工智能 算法
【C++杂货铺】再谈哈希算法:位图 | 布隆过滤器 | 哈希切分
【C++杂货铺】再谈哈希算法:位图 | 布隆过滤器 | 哈希切分
83 0
【C++杂货铺】再谈哈希算法:位图 | 布隆过滤器 | 哈希切分
|
6月前
|
存储 Java Serverless
从 0 到 1 读懂:哈希表
从 0 到 1 读懂:哈希表
|
6月前
|
弹性计算 运维 Shell
批量下载有序文件
【4月更文挑战第29天】
41 0
|
6月前
|
算法 数据可视化 数据处理
Algorithms_算法专项_Hash算法的原理&哈希冲突的解决办法
Algorithms_算法专项_Hash算法的原理&哈希冲突的解决办法
46 0
|
机器人
A . 单词拼写检查(无错哈希)
A . 单词拼写检查(无错哈希)
74 0
|
数据可视化
UpSet|多集合韦恩图 看不太清楚咋整?用upSet吧!
UpSet|多集合韦恩图 看不太清楚咋整?用upSet吧!
168 0
|
存储 缓存 算法
【第五天】算法图解--哈希表(散列表)Hash函数
【第五天】算法图解--哈希表(散列表)Hash函数
|
人工智能 BI
L2-039 清点代码库 (25 分)(哈希)
L2-039 清点代码库 (25 分)(哈希)
121 0
L2-039 清点代码库 (25 分)(哈希)
leetcode【哈希表—简单】383.赎金信 II
leetcode【哈希表—简单】383.赎金信 II
leetcode【哈希表—简单】383.赎金信 II