一般都是把 Go 看成是现代化的 C,在 C 的基础上做了很多改进,语法更简单,很多语句也更优美了(比如 for)。但是也埋下了一些坑,不注意就会踩到,比如下面的这个运算符优先级的问题。
这个坑是在写加解密算法的时候碰到的,代码类似 这两行,如下:
v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1) v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3) 上面的两行代码是正确的,忘了当初是忘记加哪个括号了,当时检查代码好久都没发现问题,直到后来一点点加上括号才找出问题来:原来在 Go 里,+ - 和 ^ 的优先级是一样的,而在 C/C++ 里,+ - 的优先级要高于 ^。
其实也不用举这么复杂的例子,下面的简单例子就可以说明问题了:
3 * 2 << 3 * 2 在 Go 里 结果是 ((3 * 2) << 3) * 2 = 96,而在 C/C++, 以及 Python 里,结果却是 (3*2) << (3*2) = 384。
Windows 下搭建 Spark 源代码阅读环境
用 Spark 做数据分析也有半年多了,觉得至少应该大致过一下源代码。在 Windows 下搭建环境还是有点不太方便的,把步骤记录一下。
当然要用 Intellij IDEA (下文简称 Idea ),安装 Scala 插件。另外,也可以把 sbt 插件装上。
首先下载 Spark 1.5.0 源代码。
然后在 Idea 里, File -> New -> Project From Existing Source 选择 Spark 解压后的目录, Import project from external model -> Maven,然后一路 Next,等待处理完毕。
视网络情况而定,不太好的话可能需要半个小时。然后就可以编译 Spark 了:Build -> Rebuild Project
当然不一定成功,如果报的错误是 Error:(44, 66) not found: type SparkFlumeProtocol val 的话,做如下处理:
View -> Tool Window -> Maven Projects 选择 Spark Project External Flume Sink, 右键 -> Generate Sources and Update Folders 之后一般就能编译成功了,会有很多 Warning,都可以忽略。
密码学基础简介
某天下午公司几个开发为一个接口的某个字段的安全性争论很久,为到底是用 AES 还是 MD5 还是 SHA1 争论,为 Java 和 Go 的 AES 加密结果为何不同调试很久……
其实这也没啥,如果没有系统地学过或了解过密码学的相关知识,这些概念以及实际的开发是会遇到问题。下面就来简单介绍密码学的基础知识,大部分内容都是来自 Computer Networks (5th Edition) ,所以看书是最好的选择。
不妨来看开发人员对 AES 和 MD5 的争论,其实这俩根本就不是一个东西。AES 是加密算法,而 MD5 是消息摘要算法,用途都是不一样的。因此首先来把密码学分成两类:加密和数字签名。
1 加密 加解密是密码学的核心。加密是将明文用算法和密钥加密成密文,解密是将密文用算法和密钥还原明文。为了抵抗密码分析,通常要求加密算法比较固定,但是密钥经常改变,因此衍生出 Kerckhoff's principle : 所有的算法都应该是公开的,只有密钥需要保密。
另外,密码学的两条基础原则是:
冗余性。密文应该含有一定的冗余,以便接收方能检查密文的合法性。 时效性。要能抵御重放攻击。 加密算法主要分为两类:对称密钥加密和公钥加密。
1.1 对称密钥加密 顾名思义,对称密钥加密指的是加密和解密的密钥是相同的,这就要求加解密双方首先安全地传递密钥。常见的算法主要有:
DES (Data Encryption Standard) Triple DES (EDE, Encrypt Decrypt Encrypt) AES (Advanced Encryption Standard) - Rijndael 其中,AES 是 NIST 邀请全世界的专家来设计的加密标准,被选中的算法是 Rijndael,但是通常大家都称之为 AES 。当时的主要竞争者有 Twofish 和 Serpent,Rijndael 虽然加密强度不是最高的,但是实现简单,速度最快,可扩展性等指标都表现较好,综合考虑评价最优,因此被选中。这几个算法的比较可以参考 这个文档。