随笔分类 - 算法和数据结构
摘要:多读多写下,先进后出队列,可以不加锁,下面是实现代码 lifo.h#include "cas.h" #include <stddef.h>struct lifo_node { volatile struct lifo_node *next; };struct lifo { void init() { top = NULL; cnt=0; } void push(lifo_node *node) { struct lifo old_val, new_val; do { old_val = *this; node->next = old_val.top; ne
阅读全文
摘要:Chrod算法是P2P中的四大算法之一,是有MIT(麻省理工学院)于2001年提出,其他三大算法分别是: CAN Pastry Tapestry Chord的目的是提供一种能在P2P网络快速定位资源的的算法,Cord并不关心资源是如何存储的,只是从算法层面研究资源的取得,因此Chord的API就简单到只有一个set、get。 1、Chord是什么? Chord是一个算法,也是一个协议。作为一个算法...
阅读全文
摘要:Richard Jones Blog : http://www.metabrew.com/article/libketama-consistent-hashing-algo-memcached-clients In old way, clients mapped keys->servers like this:server = serverlist[hash(key)%serverlist.len...
阅读全文
摘要:前两天在网上看到世界知名的电骡服务器Razorback 2被查封、4人被拘禁的消息,深感当前做eMule / BitTorrent等P2P文件交换软件的不易。以分布式哈希表方式(DHT,Distributed Hash Table)来代替集中索引服务器可以说是目前可以预见到的为数不多的P2P软件发展趋势之一,比较典型的方案主要包括:CAN、CHORD、 Tapestry、Pastry、Kademlia和Viceroy等,而Kademlia协议则是其中应用最为广泛、原理和实现最为实用、简洁的一种, 当前主流的P2P软件无一例外地采用了它作为自己的辅助检索协议,如eMule、Bitcomet、Bi
阅读全文
摘要:为什么要整数哈希 很多时候,可以直接用整数作为键,比如QQ号码,手机号码,但这些号码的分布性不是均匀的(比如高位的变化更少,低位变化更多)。 分布均匀指的是每位为0或1的概率都是一样的。 理论基础 整数哈希的目标 1. 函数要是可逆的(1对1的映射) 2. 雪崩效应(输入中1bit的变化 影响 输出中1/4 到 1/2的bits变化) 可逆操作 key +...
阅读全文
摘要:#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...
阅读全文
摘要:命令行处理和 gperf 的作用 命令行处理一直以来都是软件开发中最容易被忽视的领域。几乎所有比较复杂的软件都具有一些可用的命令行选项。事实上,大量 if-else 语句经常被用来处理用户输入,因此维护这种遗留代码相当费时,对资深程序员亦是如此。这种情形下,很多 C 开发人员通常使用冗长(通常都嵌套使用)的 if-else 语句,以及 ANSI C 库函数,例如 strcmp、strcasecm...
阅读全文
摘要: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
阅读全文
摘要:#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)
阅读全文
摘要: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
阅读全文
摘要:最近在研究无锁算法, 参照Michael and Scott的伪码,实现了个c++版本。参考 http://www.cs.rochester.edu/research/synchronization/pseudocode/queues.html 伪代码是:Code highlighting prod...
阅读全文