艾莉亚的猫 Time is limited, To be a better man

curl命令

不久前用libcurl写了个简易的中间件(动态链接库),现在总结一下curl工具的简单使用, 上传下载文件等不做介绍,其他的具体细节方面请参考manual文档。

curl - transfer a URL

CURL是一个利用URL语法在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称CURL为下载工具。

菲波那契数列实现

递归实现

使用公式f[n]=f[n-1]+f[n-2],依次递归计算,递归结束条件是f[1]=1,f[2]=1。 需要注意频繁的函数调用对性能的影响。

int fib(int n)
{
	if(n == 0)
		return 0;
	if(n == 1)
		return 1;
	if(n > 1)
		return fib(n-1) + fib(n-2);
}

数组实现

空间复杂度和时间复杂度都是0(n),效率一般,比递归来得快。

int fib(int n)
{
	if(n == 0)
		return 0;
	if(n == 1 || n == 2)    
		return 1;

	int *a = new int[n+1];
	a[0]=0;
	a[1]=1;
	for(int i=2; i <= n; i++)
	{   
		a[i] = a[i-1] + a[i-2];
	}   

	int m = a[n];
	delete[] a;

	return m;
}

字符串匹配的KMP算法

字符串匹配是计算机的基本任务之一,举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。

这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章,我才真正理解这种算法。下面,我用自己的语言,试图写一篇比较好懂的KMP算法解释。

一致性HASH算法

OpenStack Swift 开源项目提供了弹性可伸缩、高可用的分布式对象存储服务,适合存储大规模非结构化数据。Swift利用一致性Hash算法构建了一个冗余扩展的分布式对象存储集群,Swift 采用一致性哈希的主要目的是在改变集群的 device 数量时,能够尽可能少地改变已存在 Key 和 device 的映射关系。本文就介绍 Swift 的一致性哈希算法。


一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。

一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义:

平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。

单调性(Monotonicity):单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。

分散性(Spread):在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。

负载(Load):负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同 的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。

在分布式集群中,对机器的添加删除,或者机器故障后自动脱离集群这些操作是分布式集群管理最基本的功能。如果采用常用的hash(object)%N算法,那么在有机器添加或者删除后,很多原有的数据就无法找到了,这样严重的违反了单调性原则。接下来主要讲解一下一致性哈希算法是如何设计的。

代理服务器

买了一年的红杏会员,还有两三个月才到期就不能用了,被请去喝茶了?也是醉。话说用惯了红杏,现在翻不了墙也是不行,平日里好歹也要google查查资料的,遂花了五十块买了个Shadowsocks,配置挺麻烦的,设置的代理规则也不灵活。总之不太好用 :(

1