no-title

在网络上传输文件时, 如果使用对称加密, 那么密钥的就必须以明文传输, 这就失去了加密的意义.
而用 RSA 等非对称加密算法加密大文件会比较慢.
更好的方法是, 生成一个对称密钥(key), 用这个 key 去加密文件, 然后用对方的私钥去加密key. 对方收到文件之后, 用自己的私钥解密 key, 然后再用 key 解密文件.

Read More

Hash

hash 函数

比较常用的是 murmurhash3 :
murmurhash3.h

1
2
3
4
5
6
7
8
9
#ifndef MURMURHASH3_H_
#define MURMURHASH3_H_

// Referenec: https://github.com/goossaert/hashmap
#include <stdint.h>

void murmurhash3_x64_128 (const void* key, int len, uint32_t seed, void * out);

#endif // MURMURHASH3_H_

Read More

重写库函数或系统调用

在 Linux 上用C/C++ 编程时, 当调用标准库函数, 如 read, write, printf, malloc, realloc 时, 程序会先链接 glibc 中的 read, write, printf, malloc, realloc, 然后发起系统调用(read, write, puts, brk, mmap等). 那么如何重写(又称为 hook)这些库函数呢?

Read More

C++ 线程优雅退出

C++ 线程如何优雅退出(执行清理操作)

多线程程序中, 经常会定时执行任务. 通常的做法是, 在 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
#include <time.h>
#include <unistd.h>
#include <signal.h>
#include <iostream>
#include <thread>

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;
}

Read More

mysql 常用命令

编码

修改编码: alter database mydb character set utf-8;
查看数据库的默认编码: show variables like 'collation_%';show variables like 'character\_set\_%'; 或者 status
windows上修改默认字符集:
把文件my-default.ini 拷贝为 my.ini 并添加以下选项

1
2
3
4
default-character-set=utf8
default-storage-engine=INNODB
[client]
default-character-set=utf8

Read More

gperftools

安装

  1. 下载 gperftools-2.0.tar.gz

Read More

C++ atomic, lock 性能对比

下面的代码用 atomic 和 lock 分别实现了线程安全的计数器, 可以看到 atomic 的性能比 lock 提升了数十倍.
正常开发中可以使用C++ 标准库中的 atomic, 具有更高的性能, 比 lock 高百倍.
另外, 标准库中的 atomic_flag 也可以当做自旋锁来使用.

Read More

德州扑克(texas poker)

筹码量

  • 深筹码: 筹码量 > 200BB
  • 常规筹码: 100BB, 这也是大多数扑克室规定的最大买入.
  • 中等筹码: 35BB-50BB,

Read More

C++ 工厂模式

用途

工厂模式经常用来代码解耦。常用于插件系统,如下图所示:

用户只需要创建新的 plugin 即可,而不需要修改代码的其它部分。程序在启动的时候会自动把所有 plugin 注册到 factory 中,主程序中根据用户参数就可以创建指定的 plugin 对象。

Read More

C++ 代码调试

启动 gdb

使用条件:编译时加入 debug 信息,即 gcc -g.
进入调试:

1
2
3
gdb <program> # 直接调试可执行文件
gdb <program> <core dump file> # 查 core
gdb <program> <PID> # 调试已经启动的程序

Read More