no-title
在网络上传输文件时, 如果使用对称加密, 那么密钥的就必须以明文传输, 这就失去了加密的意义.
而用 RSA 等非对称加密算法加密大文件会比较慢.
更好的方法是, 生成一个对称密钥(key), 用这个 key 去加密文件, 然后用对方的私钥去加密key. 对方收到文件之后, 用自己的私钥解密 key, 然后再用 key 解密文件.
在网络上传输文件时, 如果使用对称加密, 那么密钥的就必须以明文传输, 这就失去了加密的意义.
而用 RSA 等非对称加密算法加密大文件会比较慢.
更好的方法是, 生成一个对称密钥(key), 用这个 key 去加密文件, 然后用对方的私钥去加密key. 对方收到文件之后, 用自己的私钥解密 key, 然后再用 key 解密文件.
比较常用的是 murmurhash3 :
murmurhash3.h1
2
3
4
5
6
7
8
9
// Referenec: https://github.com/goossaert/hashmap
void murmurhash3_x64_128 (const void* key, int len, uint32_t seed, void * out);
在 Linux 上用C/C++ 编程时, 当调用标准库函数, 如 read, write, printf, malloc, realloc 时, 程序会先链接 glibc 中的 read, write, printf, malloc, realloc, 然后发起系统调用(read, write, puts, brk, mmap等). 那么如何重写(又称为 hook)这些库函数呢?
多线程程序中, 经常会定时执行任务. 通常的做法是, 在 while 循环中执行一个 task, 然后 sleep 一段时间. 如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
bool is_stopped = false;
void nanotask() {
struct timespec interval;
interval.tv_sec = 10;
interval.tv_nsec = 0;
while(!is_stopped) {
std::cout << "nanosleeping" << std::endl;
nanosleep(&interval, NULL);
std::cout << "wake up" << std::endl;
}
}
void task() {
while(!is_stopped) {
std::cout << "sleeping" << std::endl;
// sleep 底层实现还是 nanosleep
sleep(10);
std::cout << "wake up" << std::endl;
}
std::cout << "cleanup" << std::endl;
}
void handler(int sig) {
std::cout << "got signal:" << sig << std::endl;
// 虽然设置了is_stopped = true, 但是要等到 sleep 返回, 程序才能结束
is_stopped = true;
}
int main() {
// 谨慎使用 signal, 尽量使用 sigaction
struct sigaction sa;
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
std::thread t1(task);
std::thread t2(nanotask);
t1.join();
t2.join();
std::cout << "thread exit" << std::endl;
return 0;
}
下面的代码用 atomic 和 lock 分别实现了线程安全的计数器, 可以看到 atomic 的性能比 lock 提升了数十倍.
正常开发中可以使用C++ 标准库中的 atomic
另外, 标准库中的 atomic_flag 也可以当做自旋锁来使用.