哈希算法在很多系统中有应用,除了在hashmap等数据结构中用外在负载均衡上也有应用,hash算法的性能直接影响很多底层应用,最近在看leveldb源码看到里面用到的hash算法,具体记录一下。
以前没写过多少java对java的注解模式很好奇,今天就凑空研究一下看一下。
元注解包括四种@Retention @Target @Document @Inherited这四种注解。
typeof字段可以识别变量类型,实现泛型,下面是一个泛型的例子。
#define min(x, y) ({ \
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
(void) (&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; })
很多游戏和软件都是用了lua热更新技术,以前对lua热更新不太熟悉,前段时间刚好帮同事个小忙就研究了一下,很多都是比较浅显,有错误还要读者指出。lua作为热更新包还是有很多优势的,首先lua性能算是比较高的,虽然比着C的性能还差一些,但是相当不错。其次lua比较好写,对于迭代比较高的一些游戏业务或者其他需要反复开发的业务都很适合。另外lua很容易内嵌到C语言中,简直是无缝结合,所以很多厂商用lua脚本来写那些需要快速迭代的业务。
基于lua的更新包一般有三种文件:lua、luac、luaJIT。lua是明文代码,直接用记事本就能打开;luac是lua编译后的字节码,文件头为
0x1B 0x4C 0x75 0x61 0x51
lua虚拟机能够直接解析lua和luac脚本文件;而luaJIT是另一个lua的实现版本,JIT是指Just-In-Time(即时解析运行),luaJIT比lua和luac更加高效,文件头是
0x1B 0x4C 0x4A。
写代码的时候hashmap或者hashtable必不可少,下面总结了一些hash函数的C实现。
unsigned add_hash(void *key, int len)
{
unsigned char *p = key;
unsigned h = 0;
int i;
for (i = 0; i < len; i++)
{
h += p[i];
}
return h;
}
Rcu数据结构是基于rcu机制实现的数据结构。RCU(Read-Copy Update),顾名思义就是读-拷贝修改,它是基于其原理命名的。对于被RCU保护的共享数据结构,只读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个类似回调(callback)机制(未必必须是回调机制)在适当的时机把指向原来数据的指针重新指向新的被修改的数据。这个时机就是所有引用该数据的CPU都退出对共享数据的操作。前面讲过在Allocator的设计中,对内存的回收是带有时间戳用来对内存进行延迟释放。这点是专门对rcu数据进行释放,默认时间是30S。rcu机制可以实现单写多读情况下的高性能无锁并发。在针对搜索引擎,单写多读情况下,简直太友好。