pike实现

稍微读了一下源码,记录一些我认为有必要的东西,只是为了以防老年痴呆!由于整体的源码还没有看得很清楚,所以大量的错误是允许的,此篇笔记也会一直处于 查询-修改 的迭代过程。

首先拿mapping开刀

  mapping其实就是C++中的multimap,但是支持更多。

  array values(mapping)。这个方法可以返回所有mapping中的value,那么values()究竟作了什么呢?源码中是这样定义的:

 1 PMOD_EXPORT struct array *mapping_values(struct mapping *m)
 2 {
 3   INT32 e;
 4   struct keypair *k;
 5   struct array *a;
 6   struct svalue *s;
 7
 8 #ifdef PIKE_DEBUG
 9   if(m->data->refs <=0)
10     Pike_fatal("Zero refs in mapping->data\n");
11 #endif
12
13   check_mapping_for_destruct(m);
14
15   a=allocate_array(m->data->size);
16   s=ITEM(a);
17
18   /* no locking required */
19   NEW_MAPPING_LOOP(m->data) assign_svalue(s++, & k->val);
20
21   a->type_field = m->data->val_types;
22
23 #ifdef PIKE_DEBUG
24   if(d_flag > 1) check_mapping_type_fields(m);
25 #endif
26
27   return a;
28 }

  可以看到,在第15行直接申请了足够存储所有value的内存大小,第19行是一个宏,其循环了所有的可能的value,然后assign_svalue就会将每个k->value给拷贝到返回值array中,并且在27行返回a。

  mapping也可以将字符串作为key的,但是它是如何依靠一个ke=string来迅速地找到对应的value的呢?其实mapping使用的siphash(维基百科原著论文)来哈希字符串的,也就是先将字符串哈希成一个值,再跟其他的key的哈希值来匹配,这样就容易找到了。如果有兴趣可以看pike中的实现:

 1 static size_t low_hashmem_siphash24( const void *s, size_t len, size_t nbytes, size_t key )
 2 {
 3   const unsigned char * in = (const unsigned char*)s;
 4   unsigned long long inlen = MINIMUM(len, nbytes);
 5
 6   /* "some pseudo randomly generated bytes" 伪随机产生的字节 */
 7   unsigned INT64 v0 = 0x736f6d6570736575ULL;
 8   unsigned INT64 v1 = 0x646f72616e646f6dULL;
 9   unsigned INT64 v2 = 0x6c7967656e657261ULL;
10   unsigned INT64 v3 = 0x7465646279746573ULL;
11   unsigned INT64 b;
12   unsigned INT64 k0 = (unsigned INT64)key;
13   unsigned INT64 k1 = (unsigned INT64)key;
14   unsigned INT64 m;
15   const unsigned char *end = in + inlen - ( inlen % sizeof( unsigned INT64 ) );
16   const int left = inlen & 7;
17   b = ( ( unsigned INT64 )inlen ) << 56;
18   v3 ^= k1;
19   v2 ^= k0;
20   v1 ^= k1;
21   v0 ^= k0;
22
23   for ( ; in != end; in += 8 )
24   {
25     m = U8TO64_LE( in );
26     v3 ^= m;
27     SIPROUND;
28     SIPROUND;
29     v0 ^= m;
30   }
31
32   switch( left )
33   {
34   case 7: b |= ( ( unsigned INT64 )in[ 6] )  << 48;
35
36   case 6: b |= ( ( unsigned INT64 )in[ 5] )  << 40;
37
38   case 5: b |= ( ( unsigned INT64 )in[ 4] )  << 32;
39
40   case 4: b |= ( ( unsigned INT64 )in[ 3] )  << 24;
41
42   case 3: b |= ( ( unsigned INT64 )in[ 2] )  << 16;
43
44   case 2: b |= ( ( unsigned INT64 )in[ 1] )  <<  8;
45
46   case 1: b |= ( ( unsigned INT64 )in[ 0] ); break;
47
48   case 0: break;
49   }
50
51   v3 ^= b;
52   SIPROUND;
53   SIPROUND;
54   v0 ^= b;
55   v2 ^= 0xff;
56   SIPROUND;
57   SIPROUND;
58   SIPROUND;
59   SIPROUND;
60   b = v0 ^ v1 ^ v2  ^ v3;
61   return (size_t)b;
62 }

low_hashmen_siphash24

时间: 2024-10-19 02:05:27

pike实现的相关文章

OpenStack pike版 安装openstack服务(4) 续安装openstack服务(3) &nbsp; &nbsp;

Compute service overview 计算服务概述 OpenStack用于对主机的计算和管理云计算系统.OpenStack的计算是一个基础设施即服务(IaaS)系统的一个重要组成部分.主要模块是用python实现的. OpenStack计算与OpenStack身份验证交互用来完成认证:OpenStack镜像服务用于磁盘和服务器镜像:用户和管理接口为OpenStack Dashboard.镜像访问受到项目和用户的限制,每个项目的配额是有限的(例如,实例的数量).OpenStack计算可

OpenStack pike版 基本环境部署(2) 续案例架构(1)

续案例架构(1) 环境准备工作: 按照以下规划配置各主机IP地址及主机名称 # controller 10.0.0.11       controller # compute1 10.0.0.31       compute1 # block1 10.0.0.41       block1 # object1 10.0.0.51       object1 # object2 10.0.0.52       object2 做名称解析: 编辑/etc/hosts文件,将以上内容写入即可. 关闭所

Concurrency Is Not Parallelism (Rob pike)

Rob pike发表过一个有名的演讲<Concurrency is not parallelism>(https://blog.golang.org/concurrency-is-not-parallelism), 演讲胶片在talks.golang.org中可以找到(https://talks.golang.org/2012/waza.slide#1), 演讲视频地址 :https://vimeo.com/49718712 以下是根据视频转换的文本信息. if you looked at t

谷歌大牛 Rob Pike 的 5 个编程原则

谷歌大牛 Rob Pike 的 5 个编程原则 简介: Rob Pike,目前谷歌公司最著名的软件工程师之一,曾是贝尔实验室Unix开发团队成员,Plan9操作系统开发的主要领导人,Inferno操作系统开发的主要领导人.他是缔造Go语言和Limbo语言的核心人物.下面是他分享给大家他在贝尔实验室工作的一段经历,这段经历改变了他对bug调试的思想认识. 主要工作经历: 我在贝尔实验室工作了很多年.我在计算机科学研究中心,你会很诧异,这是个很小的实验室,但这里却创造了Unix,我来到这里工作的时候

OpenStack pike版 安装openstack服务(3) 续基本环境部署(2)

安装openstack服务 所有openstack服务的安装指南链接:https://docs.openstack.org/pike/install/ 最小化部署,需要按照下面指定的顺序安装以下服务: Identity service – keystone installation for Pike Image service – glance installation for Pike Compute service – nova installation for Pike Networkin

Talk 3: Rob Pike on Upspin (Gopherfest 2017)

Talk 3: Rob Pike on Upspin Upspin is an experimental project to build a framework for naming and sharing files and other data securely, uniformly, and globally: a global name system of sorts. It is not a file system, but a set of protocols and refere

Pike学习笔记

pike的语法非常像C++,但是它也是脚本语言,所以具有一般脚本语言的特性.一个简单的pike程序,hello world: 1 int main() 2 { 3 write("Hello world!\n"); 4 return 0; 5 } string的用法,及命令行参数的例子: #! /usr/local/bin/pike //下次直接打文件名就可以了 int main(int argc, array(string) argv) { write("Welcome to

Rob Pike 的 5 个编程原则

原则 1. 你没有办法预测每个程序的运行时间,瓶颈会出现在出乎意料的地方,所以在分析瓶颈原因之前,先不要盲目猜测. 原则 2. 测试(measure).在测试之前不要优化程序,即使在测试之后也要慎重,除非一部分代码占据绝对比重的运行时间. 原则 3. 花哨的算法在 n 比较小时效率通常比较糟糕,而 n 通常是比较小的,并且这些算法有一个很大的常数.除非你确定 n 在变大,否则不要用花哨的算法.(即便 n 不变大,也要先遵循第 2 个原则.) 原则 4. 相对于朴素的算法来说,花哨的算法更容易出现

CentOS7.2非HA分布式部署Openstack Pike版 (实验)

部署环境 一.组网拓扑 二.设备配置 笔记本:联想L440处理器:i3-4000M 2.40GHz内存:12G虚拟机软件:VMware? Workstation 12 Pro(12.5.2 build-4638234) 三.虚拟机配置 Controller节点:系统:CentOS7.2 64位(最小化安装)处理器:4核内存:4G硬盘:100G网卡:3块 Compute节点:系统:CentOS7.2 64位(最小化安装)处理器:4核内存:4G硬盘:100G网卡:3块 Cinder节点:系统:Cen