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回答

liuyubobobo

2018-07-05

在网络上搜索“位运算”(或者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是安全领域的算法,对安全感兴趣的话,可以寻找安全方面的课本深入安全领域学习:)


加油!:)

0
1
南国漂泊
谢谢老师!我把老师给的链接放到笔记里了,英文看不懂,搜索了一些中文资料,对位运算有一个基本的了解了。安全领域,咋说呢……只能往后放了。先把SHA1当黑盒理解吧!
2018-07-09
共1条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程