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

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

之前的两届战况:

只学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

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

原文发布于微信公众号 - Crossin的编程教室(crossincode)

原文发表时间:2017-06-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

继承 指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;...

13710
来自专栏FreeBuf

逆向分析智能窗帘频射协议

近来我热衷于对家庭自动化设备的破解,然后将它们添加到我的Homekit集成包之中。这事情要从几个月前说起,当时我爸订购了大批量的RAEX 433MHz射频电动窗...

32750
来自专栏Python爬虫与算法进阶

爬虫之全站爬取方法

其实这个很好理解。比如说知乎,一个大V有100W粉丝,从这个大V出发,抓取粉丝的粉丝,一直循环下去。(可能是个死循环)

46730
来自专栏java一日一条

Java高级软件工程师面试考纲

如果要应聘高级开发工程师职务,仅仅懂得Java的基础知识是远远不够的,还必须懂得常用数据结构、算法、网络、操作系统等知识。因此本文不会讲解具体的技术,笔者综合自...

8310
来自专栏学习力

《Java从入门到放弃》框架入门篇:spring中AOP的配置方式

233110
来自专栏圣杰的专栏

EF Core中避免贫血模型的三种行之有效的方法

17240
来自专栏大数据文摘

史上最强算法论战:请不要嘻哈,这是哈希

29460
来自专栏吉浦迅科技

DAY37:阅读不同存储器的修饰符

14640
来自专栏后端技术探索

php进阶

基本数据类型和数组都为真复制,即为真副本,当属性为对象时,为假复制,改变副本仍会影响原对象.解决方案:

18710
来自专栏Java编程技术

UML建模(类图)

类图是面向对象系统建模中重要的图,是定义其它图的基础。类图主要是用来展现软件系统中的类、接口以及它们之间的静态结构。

16220

扫码关注云+社区

领取腾讯云代金券