leveldb 源码导读

1, slice.h中slice是leveldb内部使用的字符串类,代码很简单

2, LevelDB 存储编码


对于字节存储分大端小端字节序还是小端小端字节序
LevelDB使用的是小端字节序存储,低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
编码分为变长的VarInt和固定大小FixedInt两种,每种分32位和64位。

固定大小的FixedInt32和FixedInt64的编码 文件coding.cc


不定大小的VarInt编码
int32类型的数字,一般需要4个byte来表示,int64类型的数字,一般需要8个byte来表示;
Varint是一种紧凑的表示数字的方法。它用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数。数值小的用一个字节就可以存储。


3, AtomicPointer 是 leveldb 提供的一个原子指针操作类,使用了基于原子操作(atomic operation)或者内存屏障(memory barrier)的同步访问机制,这比用锁和信号量的效率要高

4, 现在我们来看看levelDB里随机数Random类是如何实现的:
在Random类中,A为16807,M为2147483647,C为0;

uint32_t Hash(const char* data, size_t n, uint32_t seed) {
  // Similar to murmur hash
  const uint32_t m = 0xc6a4a793;
  const uint32_t r = 24;
  const char* limit = data + n;
  uint32_t h = seed ^ (n * m);

  // Pick up four bytes at a time
  while (data + 4 <= limit) {
    uint32_t w = DecodeFixed32(data);
    data += 4;
    h += w;
    h *= m;
    h ^= (h >> 16);
  }

  // Pick up remaining bytes
  switch (limit - data) {
    case 3:
      h += data[2] << 16;
      FALLTHROUGH_INTENDED;
    case 2:
      h += data[1] << 8;
      FALLTHROUGH_INTENDED;
    case 1:
      h += data[0];
      h *= m;
      h ^= (h >> r);
      break;
  }
  return h;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值