335
1 min 如何破解一个 ELF 文件:hackme: Deconstructing an ELF File
几点启示:
- 编译时要使用 strip 选项
- 避免在代码中使用字符串常量存放敏感信息,
strings
工具可以轻易 dump 出来 - 在调用库函数、系统函数时,避免在参数中传递明文的敏感信息,
ltrace
, strace
等工具可以轻易调试出来
另外,在Java代码中,也要避免使用明文字符串保存敏感信息,尤其是不要用 String
来保存密码,原因主要有以下几点:
403
1 min Bloom Filter 是由 Bloom 在 1970 年提出的一种多哈希函数映射的快速查找算法。
通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求 100% 正确的场合。
HashMap 的问题
HashMap 具有 O(1) 的查找复杂度,但缺点也很明显:内存利用率不高。
673
2 mins 缓存类装饰器
@cache
用于自动缓存函数的返回结果(即其他语言常见的 memoize)。
使用起来非常简单,给函数增加 @cache
装饰器(Decorator)即可:
1
2
3
4
5
6
7
8
9
10
11
12
| from functools import cache
@cache
def factorial(n):
return n * factorial(n-1) if n else 1
>>> factorial(10) # 无缓存结果, 触发 11 次递归调用
3628800
>>> factorial(5) # 直接返回缓存结果
120
>>> factorial(12) # 触发 2 次递归调用, 其余 10 次直接使用缓存的结果
479001600
|
由于缓存是通过字典来实现的,key 就是函数的参数,所以,参数必须是 hashable 的。
575
2 mins 安全的强推 push —froce-with-lease
推荐使用更安全的 force push 命令:
1
| git push --force-with-lease
|
该版本可以确保,不会覆盖其他人的提交。如果有尚未 fetch 的远程提交,该命令会提示并中止执行。
定位某个 commit 合入的版本
git name-rev <commit-id>