基本上看到一种测试方法,只要您匹配,a1 * 31 + b1 = a2 * 31 + b2,这意味着(a1-a2)* 31 = b2-b1
public void testHash(){ System.out.println("A:" + ((int)'A')); System.out.println("B:" + ((int)'B')); System.out.println("a:" + ((int)'a')); System.out.println(hash("Aa".hashCode())); System.out.println(hash("BB".hashCode())); System.out.println(hash("Aa".hashCode())); System.out.println(hash("BB".hashCode())); System.out.println(hash("AaAa".hashCode())); System.out.println(hash("BBBB".hashCode())); System.out.println(hash("AaBB".hashCode())); System.out.println(hash("BBAa".hashCode()));}你会得到
A:65B:66a:9722602260226022602019172201917220191722019172
编辑:有人说这还不够简单。 我在下面添加了
@Test public void testN() throws Exception { List<String> l = HashCUtil.generateN(3); for(int i = 0; i < l.size(); ++i){ System.out.println(l.get(i) + "---" + l.get(i).hashCode()); } }AaAaAa---1952508096AaAaBB---1952508096AaBBAa---1952508096AaBBBB---1952508096BBAaAa---1952508096BBAaBB---1952508096BBBBAa---1952508096BBBBBB---1952508096以下是源代码,它可能效率不高,但是可以正常工作:
public class HashCUtil { private static String[] base = new String[] {"Aa", "BB"}; public static List<String> generateN(int n) { if(n <= 0) { return null; } List<String> list = generateOne(null); for(int i = 1; i < n; ++i) { list = generateOne(list); } return list; } public static List<String> generateOne(List<String> strList) {if((null == strList) || (0 == strList.size())) { strList = new ArrayList<String>(); for(int i = 0; i < base.length; ++i) { strList.add(base[i]); } return strList; } List<String> result = new ArrayList<String>(); for(int i = 0; i < base.length; ++i) { for(String str: strList) { result.add(base[i] + str); } } return result; }}看一下String.hashCode()
public int hashCode() { int h = hash; if (h == 0) { int off = offset; char val[] = value; int len = count; for (int i = 0; i < len; i++) { h = 31*h + val[off++]; } hash = h; } return h; }


