12 2010 档案

摘要:php, apache, perl, bsddb都使用time33哈希. 最简单的版本     uint32_t time33(char const *str, int len)     {         uint32_t  hash = 0;         for (int i = 0; i len; i++) {             hash = hash *33 + (unsi... 阅读全文
posted @ 2010-12-31 14:39 napoleon_liu 阅读(262) 评论(0) 推荐(0)
摘要:wiki上的说明:http://en.wikipedia.org/wiki/Time_Stamp_Counter intel 有的CPU tsc的变化是固定的(不会随 cpu节电的影响)。  判断CPU是否支持常量TSC,可以使用 “cat /proc/cpuinfo | grep constant_tsc“, 有输出就表示支持。   下面是tsc的读取代码,  cpuid是为了解决CPU乱... 阅读全文
posted @ 2010-12-31 10:02 napoleon_liu 阅读(570) 评论(2) 推荐(0)
摘要:为什么要整数哈希   很多时候,可以直接用整数作为键,比如QQ号码,手机号码,但这些号码的分布性不是均匀的(比如高位的变化更少,低位变化更多)。   分布均匀指的是每位为0或1的概率都是一样的。 理论基础 整数哈希的目标     1. 函数要是可逆的(1对1的映射)     2. 雪崩效应(输入中1bit的变化 影响 输出中1/4 到 1/2的bits变化) 可逆操作     key +... 阅读全文
posted @ 2010-12-29 16:54 napoleon_liu 阅读(11682) 评论(0) 推荐(1)
摘要:#include stdint.h #include stdlib.h #include assert.h #include string.h inline uint32_t kr_hash(char const *str, size_t len) {    uint32_t hash =0;    unsigned char const*p =(unsigned char con... 阅读全文
posted @ 2010-12-28 20:10 napoleon_liu 阅读(954) 评论(0) 推荐(0)
摘要:START-INFO-DIR-ENTRY * Gperf: (gperf).                Perfect Hash Function Generator. END-INFO-DIR-ENTRY 介绍 ************   'gperf'是一个用C++编写的完美的hash函数生成器.它通过一个完美的hash函数F转 换一个含有N元素的用户特定关键字集合到集合W. F唯一映... 阅读全文
posted @ 2010-12-27 16:28 napoleon_liu 阅读(1752) 评论(0) 推荐(0)
摘要:命令行处理和 gperf 的作用 命令行处理一直以来都是软件开发中最容易被忽视的领域。几乎所有比较复杂的软件都具有一些可用的命令行选项。事实上,大量 if-else 语句经常被用来处理用户输入,因此维护这种遗留代码相当费时,对资深程序员亦是如此。这种情形下,很多 C 开发人员通常使用冗长(通常都嵌套使用)的 if-else 语句,以及 ANSI C 库函数,例如 strcmp、strcasecm... 阅读全文
posted @ 2010-12-27 11:12 napoleon_liu 阅读(1883) 评论(3) 推荐(0)
摘要:Lex 代表 Lexical Analyzar。Yacc 代表 Yet Another Compiler Compiler。 让我们从 Lex 开始吧。 Lex Lex 是一种生成扫描器的工具。扫描器是一种识别文本中的词汇模式的程序。这些词汇模式(或者常规表达式)在一种特殊的句子结构中定义,这个我们一会儿就要讨论。 一种匹配的常规表达式可能会包含相关的动作。这一动作可能还包括返回一个标记。当... 阅读全文
posted @ 2010-12-27 09:56 napoleon_liu 阅读(571) 评论(1) 推荐(0)
摘要:FNV是 Glenn Fowler, Landon Curt Noll, and Phong Vo 三人的缩写。 FNV-1 哈希算法的核心思想如下: 实现源码 uint32_t fnv_hash(char const *str, int len) { unsigned long hash = 2166136261; //offset_basis //FNV prime for 32 bit is 16777619//#define FNV_OP() hash = (hash*16777619)^*str++#define FNV_OP() hash += (hash1) + (has 阅读全文
posted @ 2010-12-26 21:56 napoleon_liu 阅读(3105) 评论(1) 推荐(0)
摘要:#includestdio.h#includestring.h#include stdlib.h#include stdint.huint32_t rotate_hash(char *key, uint32_t len, uint32_t mask){ uint32_t hash, i; for (hash=0, i=0; ilen; ++i) hash = (hash5)^(hash27)^key[i]; return hash = (hash ^ (hash10) ^ (hash20)) & mask; // replace (hash % prime) 阅读全文
posted @ 2010-12-25 11:06 napoleon_liu 阅读(399) 评论(0) 推荐(0)
摘要:http://burtleburtle.net/bob/hash/doobs.html Bob优化它的第二版本hash, 速度提高了3倍,http://burtleburtle.net/bob/c/lookup3.c 下面我提取的一个变长key, 小端版本(intel机器) #include stdint.h /* defines uint32_t etc */ #include sys/param.h /* attempt to define endianness */ #ifdef linux # include endian.h /* attempt to define 阅读全文
posted @ 2010-12-22 17:22 napoleon_liu 阅读(2111) 评论(1) 推荐(0)
摘要:Bob 研究了很多哈希,并实现了自己的高效hash。 我测试一下了,5w多的数据,time33出现了6条重复,bobhash没有一条重复。不过time33的速度是比bobhash快的。 http://burtleburtle.net/bob/hash/doobs.html 源码 typedef unsigned int uint32_t; #define hashsize(n) ((uint32_t)1(n)) #define hashmask(n) (hashsize(n)-1) #define mix(a,b,c) \ { \ a -= b; a -= c; a ^= (c13 阅读全文
posted @ 2010-12-22 14:15 napoleon_liu 阅读(1265) 评论(0) 推荐(0)
摘要:gzip,zlib,以及图形格式png,使用的是同一个压缩算法deflate。我们通过对gzip源码的分析来对deflate压缩算法做一个详细的说明。我阅读的gzip版本为 gzip-1.2.4。我 们对算法做三种程度的说明。第一种程度,对gzip所使用压缩算法基本原理的说明。第二种程度,对gzip压缩算法实现方法的说明。第三种程度,对gzip实现源码级的说明。 如果你有时间的话,我建议你先不要看下面的内容,自己尝试通过读gzip源码,来了解它的压缩解压缩是如何实现的,这将会是一个非常有趣的智力游戏,千万不要错过。当 一个又一个的谜被解开时,那感觉就像唐伯虎同志所说的,“慷慨然诺杯酒中”。(小 阅读全文
posted @ 2010-12-16 20:42 napoleon_liu 阅读(1668) 评论(0) 推荐(0)
摘要:全新的思路 我们在第三和第四章中讨论的压缩模型都是基于对信息中单个字符出现频率的统计而设计的,直到 70 年代末期,这种思路在数据压缩领域一直占据着统治地位。在我们今天看来,这种情形在某种程度上显得有些可笑,但事情就是这样,一旦某项技术在某一领域形成了惯例,人们就很难创造出在思路上与其大相径庭的哪怕是更简单更实用的技术来。 我们敬佩那两个在数据压缩领域做出了杰出贡献的以色列人,因为正是他们打破... 阅读全文
posted @ 2010-12-16 20:36 napoleon_liu 阅读(4622) 评论(5) 推荐(0)
摘要:C里操作字符串很高效,但也很麻烦。 1. char * strcpy ( char * destination, const char * source ); 最常用的函数,但是却不安全,原因在于,一是要destination有足够的空间,二是要保证source和destination指向的空间没有overlap。 2. int sprintf ( char * str, const cha... 阅读全文
posted @ 2010-12-16 10:16 napoleon_liu 阅读(2095) 评论(2) 推荐(0)
摘要:全局变量,全局对象初始化,很方便。但过多的全局初始化,会导致程序启动时间过慢,还有全局初始化顺序不好控制(连接器可以可以控制文件之间的顺序,但那需要写好makefile, 并放映程序的实际依赖,没做到DRY).   我使用了内核的list_head 结构了组织初始化函数, 每个文件有一个file_node的结构来保持本文件内的初始化函数,file_node会注册的全局的一个分级数组中, fil... 阅读全文
posted @ 2010-12-10 15:14 napoleon_liu 阅读(2269) 评论(0) 推荐(0)
摘要:history 查看历史命令 Ctr+R 可以增量查找命令 其实Shell,还有个比较隐蔽的命令,叫bang bang, 就是!!   Bang Bang !!    重新执行上一条命令 !N  重新执行第N条命令。比如 !3 !-N 重新执行倒数第N条命令。!-3 !string  重新执行以字符串打头的命令。 比如 !vim !?string?  重新执行以字符串的命令。 比... 阅读全文
posted @ 2010-12-07 19:53 napoleon_liu 阅读(515) 评论(0) 推荐(1)
摘要:C 有 null-end string, C++有std::string, 各有千秋。 C字符串 以 zero 作为终止符,所有字符串操作,都需要判断这个终止符;这也是每个字符串操作,都需要重新知道字符串长度,这很冗余。解决办法有,手动保持字符串长度,调用呆长度的C字符串函数。 std::string C++的string试图解决C的问题,并把内存管理包揽了。在大多数情形下,这都不是问题。但当你不需要它管理内存时,没有了办法。比如字符串常量(继承C导致的问题),比如一个请求包中子串(包的周期很长)。 C++ string不够好,那么可以定义一个,不需要管理内存的string, 只提供便利操 阅读全文
posted @ 2010-12-06 21:10 napoleon_liu 阅读(1062) 评论(0) 推荐(0)
摘要:Effective STL中说过,std::map 是一个比较通用的实现,如果你注重效率的话,Hash容器 是个更好的选择,如果你的操作,主要是(先插入数据,查找,最后删除),那么用vector来实现map,效率也会更高。 从效率的角度看,map只适合那种,需要不断插入和删除,期间夹杂查找的情形。 vector_map 为什么比map效率高 vector是线性存储,map是二叉树树形,所以vector内存访问的局部性更好 vector, 一次分配一个比较大的空间(2^n的分配方式), map每次都需要 new 或delele 一个树结点, 内存分配是很耗时的。 vector_map, 可以在 阅读全文
posted @ 2010-12-06 20:29 napoleon_liu 阅读(6696) 评论(1) 推荐(1)
摘要:Lua ,语法简单(极像javascript), 移植性好(纯C实现), 启动速度快,空间占用小, 真不愧是潜入式脚本语言之王。 本人想拿它来做 配置文件(conf),也想加一点IoC, 就是配置脚本可以调用主程序的函数。 实现如下: repeat_macro.h #ifndef __REPEAT_MACRO_H__#define __REPEAT_MACRO_H__ // concatena... 阅读全文
posted @ 2010-12-01 23:17 napoleon_liu 阅读(1576) 评论(2) 推荐(1)