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

之前的两届战况:

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

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



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

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

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

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 组成