Hashing
- hash数组的方法是ret = ((ret << 2) + (a[i] >> 4)) ^ (a[i] << 10);
- hash一个数列f,数列中的每一位都有一个上限g,即f[i]<=g[i]。那么可以将该数列hash为这样一个整数,这个整数的每一个位的进制都不同,第i位的进制是g[i] + 1,即第i位满g[i]+1则可进位。(当然由于g[i]是该位的上限,所以永远不可能进位)用p[i]表示(g[0]+1) * (g[1]+1) * ... * (g[i - 1]+1)。那么最终f被hash的结果是p[0] * f[0]+p[1] * f[1]+...。