bobo老师,可以问个"SHA1"的问题吗?
来源:14-5 实现属于我们自己的哈希表
南国漂泊
2018-07-05
在 <http://git.oschina.net/progit/1-%E8%B5%B7%E6%AD%A5.html> 上看到
Git 使用 SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个 SHA-1 哈希值,作为指纹字符串。该字串由 40 个十六进制字符(0-9 及 a-f)组成,
我对 SHA-1 很好奇,我跳到 14 章,优先观看了关于哈希的内容。有些感悟,但是由于并不是介绍 SHA-1 是如何实现的,所以,我去网上搜索了一下 SHA-1
搜索到的内容千篇一律的是 SHA-1 的使用,使用Java的话,就是对 `java.security.MessageDigest` 的调用
好不容易找到一篇实现,<https://gitee.com/juedui0769/codes/5w8txuac6p132bhqgv7nf96> 但是看到下面的代码就傻了
`tmp[i >> 5] |= ((int) (str.charAt(i / chrsz)) & mask) << (24 - i % 32);`
第14章也讲了一个 `X & 0x7fffffff` X 一定变成正数, 这个是看懂了的,但是上面的这句有点复杂,没看懂,老师可以解毒一下吗,或者告诉下我从哪里开始学习这类二级制的操作?谢谢!
1回答
-
在网络上搜索“位运算”(或者Google搜索英文"Bit Manipulation"或者"Bitwise Algorithms"),应该有不少零散的文章,帮助你理解基本位运算的含义。
比如这些文章可以扫一遍:https://www.geeksforgeeks.org/bitwise-algorithms/#basics
如果想更深刻的理解位运算,就需要动手实践了,扫一遍Leetcode上和位运算相关的练习是很有帮助。遇到不会的就直接去看discuss里大家的讨论和题解,都做下来,位运算的使用基本就没问题了。
Leetcode中位运算相关的练习:https://leetcode.com/tag/bit-manipulation/
相信这样,看懂上面这段代码是没有问题的。但是看懂这段代码,和理解这段代码为什么这样做,完全是两回事儿。这就好比我可以看懂(1 + n) * n / 2这个式子就是在做数学计算,但是理解这个式子是在求从1到n这n个数的和,完全是另外一个层次:)
具体的,SHA-1是安全领域的算法,对安全感兴趣的话,可以寻找安全方面的课本深入安全领域学习:)
加油!:)
012018-07-09
相似问题
回答 1
回答 1