False Positive Rate

$m$: 表示BloomFilter bit array的长度;
$k$: 表示hash函数个数;
$n$: 表示插入元素的个数;

假设hash函数以等概率选择bit array的下标,那么经过$k$个hash函数之后,某个bit位未被设置为1的概率为:

$$ (1 - \frac{1}{m})^k $$

在插入$n$个元素之后,某个bit位仍然没有被设置为1的概率为:

$$ (1 - \frac{1}{m})^{kn} $$

因此在插入$n$个元素之后,某个bit位被设置为1的概率为:

$$ p = 1 - (1 - \frac{1}{m})^{kn} $$

对于一个不存在于集合中的元素,...

libFuzzer 简介

LLVM libFuzzer 是 LLVM 生态系统中的一个fuzzy test工具,用于自动化地发现软件程序中的漏洞和错误。它通过生成大量的随机输入数据并观察程序的行为来进行fuzzy test。 libFuzzer 是一个基于内存的fuzzy test引擎,使用 LLVM 的插桩技术和代码优化功能来提高测试效率和覆盖率。

以下是 libFuzzer 的一些功能特点:

  1. 自动化fuzzy test:libFuzzer 提供了一种自动化的fuzzy test方法,可以生成大量的随机输入数据,并在每个输入上运行目标函数进行测试。它通过观察程序的崩溃、断言失败、未定义行为等反馈来发现潜在的问题。
  2. 内存安全...

Ref: https://www.tangramvision.com/blog/c-rust-generics-and-specialization

泛型入门:输入的类型

C++和 Rust 中的泛型都是一种将其他类型作为其定义的一部分的类型。泛型是通过在类型定义中指定占位符的一种方式,然后可以 使用更具体的类型来替换,例如在 C++中可以这定义一个泛型类型:

1template<typename T>
2struct MyArray {
3    T* raw_array;
4    std::size_t size;
5};

对于这个泛型结构而言,MyArray<int>...

Ref: https://www.tangramvision.com/blog/c-rust-interior-mutability-moving-and-ownership

C++和 Rust 中的不变性(constness)

Rust 和 C++有两个非常相似的概念,即 Rust 中的 mutability/immutability 和 C++中的 constness/non-constness. 在 Rust 中,一个给定的值要么是可变的(mutable),要么是不可变的(immutable),正如这些限定符名称所代表的含义,可变的值可以被修改,不可变的值不能被修改。 然而与 C++不同的是,Rust 中不可变的值...

在C/C++中,我们经常会像下面的代码那样使用一个指向函数的指针,我们称之为函数指针:

 1// demo.c
 2#include <stdio.h>
 3
 4int func(int a) {
 5    return a + 1;
 6}
 7
 8int main(int argc, char* argv[]) {
 9    int (*f)(int) = func;
10    printf("%p\n", f);
11    return 0;
12}

上面的例子中,我们定义了一个函数func,然后通过函数指针f指向func,接着使用print函数打印指针变量f指向 的地址。代码平淡无奇,...

std::list splice 简介

splice函数通过重新排列链表指针,将一个std::list中的节点转移到另一个std::list中。在元素的转移过程中不会触发元素的拷贝或者移动。因此,调用splice函数之后,元素现有的引用和迭代器都不会失效。

下面是一个将listA中所有节点附加到listB的一个简单代码示例,转移的过程不会导致listA中元素的引用和迭代器失效:

 1// Note: c++17 required below. (For CTAD(Class template argument deducation))
 2std::list listA{1, 2, 3};
 3std::list listB{4,...

关于 shared_ptr

shared_ptr是一种共享所有权的智能指针,它允许我们安全地访问和管理对象的生命周期。shared_ptr的多个实例通过共享控制块结构来控制对象的生命周期。 控制块维护了引用计数(reference count),弱引用计数(weak count)和其他必要的信息,通过这些信息,控制块能够确定一个对象在内存中是否可以被安全销毁。

当使用原始指针构造或者初始化一个shared_ptr时,将会创建一个新的控制块。为了确保一个对象仅由一个共享的控制块管理,必须通过复制已存在的shared_ptr对象来创建一个新的shared_ptr实例,例如:

1void good()
2{
3  auto p{new...

前言

c++11 对智能指针做了很大的优化,废弃了 c++98 中的auto_ptr,引入了三种新的智能指针:unique_ptrshared_ptrweak_ptr。 本文将针对unique_ptr的一些使用技巧做一些整理和归纳。在正式开始之前,我们首先来回顾一下unique_ptr的特点:一个unique_ptr对象内包含一个原始指针,该unique_ptr对象负责管理原始指针的生命周期。 一个unique_ptr对象始终是其关联的原始指针的唯一拥有者。

在了解了unique_ptr的特点之后,我们来具体看看日常开发中unique_ptr的一些使用场景和技巧。

一些场景

本地对象指针

在开发中,我们经常会遇到或者写出类...

什么是 Expression Templates

Expression Templates 是一种 C++ 模板元编程技术,它通过在编译时构建按需执行的计算表达式,从而生成高效的代码。简单来说,通过 Expression Templates,我们可以实现惰性求值和消除因为中间结果而创建的临时变量。

一个常规示例

我们构造了一个MyVector类,并且重载了MyVector+*操作符,实现两个MyVector中相同下标元素的+*操作。 对于这样的需求我们很容易写出形如下面代码的一个简单的实现:

 1#include <cassert>
 2#include <iostream>
 3#include...

动态多态 (Dynamic Polymorphism)

在 c++中为了实现多态,使用了一种动态绑定的技术,这个技术的核心就是虚函数表(virtual table)。下面就简单的说明一下基于虚表的动态绑定的原理,从而更好的与静态多态做比较。

在 c++中,每个包含虚函数的类都有一个虚表。我们来看下面这个类:

 1// demo.cpp
 2class A
 3{
 4public:
 5    virtual void vfunc1();
 6    virtual void vfunc2();
 7    void         func1();
 8    void         func2();
 9
10private...