感悟:谈谈编程中的哲学,数学,基础,理论,思考与经验

做为一个新人,我是无上尊崇理论的,很遗憾,我却看到不少人对理论和书本嗤之以鼻。 今天在一个web群里,突然又有人问到,md5(a)=b,那么已知b,那么如何解密出a.针对这个问题,却掀起了轩然大波,这本来是一个很没有讨论价值的东西,遗憾的是,很多人还对此争论个不休,却鲜见明白人。 首先,MD5不是一个加密函数,这点我还看到很多人在争论,吵个喋喋不休。说是加密函数的理由是他们在做网站中一直用MD5加密的,如果它不是加密函数那是什么。那么,我用我刷牙的杯子舀水洗菜,那是否可以断然说我的口水杯就是炊具呢?很简单的逻辑,其实,逻辑上的混乱是基础的不扎实。稍微学过信息安全学的人,都知道在信息安全领域,存在各种安全算法,如非对称加密,信息摘要等。这些概念都是很清晰的,都是有定论的,是没有任何争论的价值和必要的。 其实,询问如何MD5从密文还原到明文的,这就已经不是有没有学过信息安全的事,而是有没有用哲学和数学的逻辑思维来思考的问题了,一个人的悟性就往往体现在这里。我们都知道,MD5的结果是128位(不是16位,也不是32位,这个问题不该再争论了。),它可以表现为一个长度为16位或者32,甚或24位的16字符串。但是基本的形式是长度为16的字符串。好了,假如说MD5可以还原的话,我们就可以把它看做一个压缩函数。那恭喜你,你的硬盘可以装下10亿部高清电影了,因为我可以把一个1G多的高清电影MD5“加密成”只有16个字节的“密文”,我要看电影,那我只要把这16个字节还原了就可以了。这么看来,这个世界真是美妙。但这是不可能的,所以MD5还原时不可能的,就这么简单的逻辑。 很快,又有人提出反驳意见,说到04年王小云教授的报告,甚至还截图网上的报告,报告中清晰地写着王小云破解了MD5,以此来反驳我。并以数学不是绝对 的来反驳我的数学分析。也有人提到只要计算机的性能足够,就可以做到破解密码。在这里,首先我们要明白,其一,媒体总喜欢故意夸大说辞来吸引眼球;其二, 破解的定义,什么是破解,什么能叫做破解。我们学习,万万不能涉浅不涉深。至于王小云教授的破解到底是怎么回事,我也不想再细说,这又是一个长篇大论了。 可以了解下强无碰撞和弱无碰撞,有限集的概念。至于破解网站,那都是暴力字典比对。 其实,大多web程序员都是非科班出身,抑或半路出家,大多没有系统的学习,在基础的算法,数学和数据结构上都是弱项。但是,就针对MD5的是否可 还原,可破解,我只是用了一个很简单数学模型就证明了这是荒谬的。我一直在强调数学。是的,数学。作为一个经济专业的我,尤其看重数学的重要,但也要注意 到一些数学形式主义的存在。 很多编程中的问题,困惑,我们只要拿出数学和哲学这两个宝贝,就能迎刃而解。对于一些不能理解的基础性问题,多从数学和哲学的角度来理解,我们就清楚这其中的道理了。 还有一个就是理论和经验。有不少同学都很鄙视书本和理论知识,唯经验至上。这里我要大声地告诉你,你错了。何解? 首先,理论的定义应该是:理论=教科书+课外书(参考书)+工具书(手册)+Google+知识分享。而不是单纯的书本。即使是书本,那也是蕴含了极大的智慧的,尤其是教科书。至少写技术类的教科书的都是专家教授。理论不存在有没有用,只存在你到不到那个境界,用不用得上的问题。有很多我们自以为debug了半天才解决的问题,自以为得到了经验而沾沾自喜的时候,其实这些所谓的“经验”大多已经在手册上明晃晃地摆着了,或者早就被人描述过了。而 90%的情况大多如此.理论来自于实践,我们多花时间和精力把理论学好,那就可以少花点“经验”,也就是工作时间了。当然,我的观点不是否定经验的重要 性,因为一个人很难在不长的时间内学完所有的理论,他需要在工作中学以致用和不断调整,不断比对经验和理论。能重视起理论来,那我的长篇大论的目的就达到 了。 另外的一点就是多思考。我不是很赞同有人问基础的问题,除非遇到我也解决不了或者很困惑,或者我认为应该讲解一下的时候,一般我都是六个字回答“看手 册,找谷歌”。网上也有《提问的智慧》一问,也提到了,除非你花了两个小时的努力,还没解决一个问题点的时候,那你就可以提问了。这样的方式虽然看似冷酷 和缓慢,但是在经历一个略微漫长的爬升后,你就会迅速起步,掌握更多的基础和调试技术。而这,就是你的经验了。 至于说我是做web的,该不该去碰其他东西呢?是不是要专呢?我的回答是,要先把基础牢固了,基础不是歪门邪道, 不要把比如凡是和PHP无关的全部视作旁门左道。算法,数学,英语是所有程序员的基础,他们不是旁门左道。另外,对于其他知识呢?我的观点是,你可以不 懂,但你至少得理解或者听说过,起码知道有这个东西。web程序员也可以完全花点时间关注下架构,操作系统,数学啊,英语啊,seo啊,营销啊,经济啊这 些东西。不要怕它们害了你。 其实我也是个菜鸟级的新人,一个半路出家的土八路,花和尚。之所以提到这些,也正是在自己的发展中也有类似的问题和误区。也是自己经常困在代码领域中的困惑。谨在此交流愚见,欢迎切磋。 白菜博客:http://aiyooyoo.com。一个在程序员道路上奔跑的童鞋。欢迎切磋交流。

原文发布于微信公众号 - php(phpdaily)

原文发表时间:2014-11-18

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏海说

Java应用中常见的JDBC连接字符串(SQLite、MySQL、Oracle、Sybase、SQLServer、DB2)

Java应用中常见的JDBC连接字符串 Java应用中连接数据库是不可或缺的,于是便整理一些可能用到的JDBC的jar包及其相匹配的URL,以备日后查阅。 1)...

2750
来自专栏Pulsar-V

C#下各种获取时间的姿势

直接贴代码吧 DateTime dt = DateTime.Now; Label1.Text = dt.ToString();//2005-11-5 13:21...

3236
来自专栏跟着阿笨一起玩NET

GB2312转换成UTF-8与utf_8转换成GB2312

1911
来自专栏成长道路

JDBC动态SQL语句连接orcale数据库的工具类

import java.sql.Connection; import java.sql.DriverManager; import java.sql.P...

2510
来自专栏C/C++基础

C#获取系统当前时间

ystem.DateTime currentTime=new System.DateTime(); 1.1 取当前年月日时分秒 currentTime=Sy...

1153
来自专栏码匠的流水账

聊聊spring cloud的LoadBalancerAutoConfiguration

本文主要研究一下spring cloud的LoadBalancerAutoConfiguration

1052
来自专栏c#开发者

简体-繁体内码转换API

 public class ANSIConversionAPI     {         const int SIMPLIFIED_CHINESE =...

3514
来自专栏吴伟祥

Java Calendar 类的时间操作 原

Calendar 的 month 从 0 开始,也就是全年 12 个月由 0 ~ 11 进行表示。

783
来自专栏DT乱“码”

连接数据库操作

package com.chendongj.dbUtil; import java.sql.Connection; import java.sql.Drive...

2029
来自专栏跟着阿笨一起玩NET

[C#]工具类—FTP上传下载

  不错的文章:http://www.cnblogs.com/greatverve/archive/2012/03/03/csharp-ftp.html

1201

扫码关注云+社区