本文翻译了Colin Percival 于2010年在bsdcan的演讲ppt
原文标题:Everything you need to know about cryptography in 1 hour
演讲时间:May 13, 2010
原文在 https://www.bsdcan.org/2010/schedule/attachments/135_crypto1hr.pdf
演讲视频在 https://www.youtube.com/watch?v=jzY3m5Kv7Y8 ( 请自行翻墙 )
Colin Percival 是密码学方面的专家,FreeBSD项目的安全长官,Tarsnap在线备份服务的创始人,scrypt密钥衍生算法的作者,致力于改进软件中密码学的应用,向程序员传播密码学的正确使用。
一,简介 # jump consistent hash是一种一致性哈希算法, 此算法零内存消耗,均匀分配,快速,并且只有5行代码。
此算法适合使用在分shard的分布式存储系统中 。
此算法的作者是 Google 的 John Lamping 和 Eric Veach,论文原文在 http://arxiv.org/ftp/arxiv/papers/1406/1406.2294.pdf
完整代码:
int32_t JumpConsistentHash(uint64_t key, int32_t num_buckets) { int64_t b = -1, j = 0; while (j < num_buckets) { b = j; key = key * 2862933555777941757ULL + 1; j = (b + 1) * (double(1LL << 31) / double((key >> 33) + 1)); } return b; } 输入是一个64位的key,和桶的数量(一般对应服务器的数量),输出是一个桶的编号。
本文译自 “Deriving the Y Combinator in 7 Easy Steps“,
原文链接:http://igstan.ro/posts/2010-12-01-deriving-the-y-combinator-in-7-easy-steps.html
在没有原生递归支持的语言中,Y结合子(Y Combinator)是一种实现递归的方式(事实上,它更常被作为一种锻炼程序思维的方式)。要实现Y结合子,要求这种语言支持匿名函数。
此处,我选择JavaScript来推导Y结合子,从递归阶乘函数的定义开始,一步一步进行变换。
Step 1 # 最初的实现,使用JavaScript内建的递归机制。
var fact = function (n) { if (n < 2) return 1; return n * fact(n - 1); }; Step 2 # 获得递归的最简单方法是什么?我们可以定义一个函数,它接受它自身作为参数,并且用这个参数作为参数,调用这个参数。当然,这是一个无限循环,会导致栈溢出。
(function (f) { f(f); })(function (f) { f(f); }); 我们的阶乘函数套用上面的模板,再做点改动,阶乘函数接受一个我们还不知道的参数,所以我们要的是返回一个接受该参数的函数。然后这个函数可以被用于计算阶乘。同时,这可以让我们的阶乘函数不会无限循环下去。
var fact = (function (f) { return function (n) { // 终止条件 if (n < 2) return 1; //因为f返回一个函数,所以这有一个双重调用。 return n * f(f)(n - 1); }; })(function (f) { return function (n) { // 终止条件 if (n < 2) return 1; // 因为f返回一个函数,所以这有一个双重调用。 return n * f(f)(n - 1); }; });