接上一节,在把关键字改成string类型之后,需要对key进行hash化,这里使用了两种方式:
1.相加法
2.幂乘法
同时防止越界,我们使用了压缩值的方法即取余数。但是由于int的长度限制,我们使用了biginterger方法。
info类和上节相同,这里只丢出hashTable的源代码:
public class hashTable {
private Info[] array; public hashTable() { // TODO Auto-generated constructor stub array = new Info[100]; } public hashTable(int MaxSize) { array = new Info[MaxSize]; } //插入数据 public void insert(Info info) { array[hashCode1(info.getKey())] = info; } //查看数据 public Info find(String key) { return array[hashCode1(key)]; } //hash编码 public int hashCode1(String key) { // int hashKey =0;// int letter;// int pow27 = 1; BigInteger hashKey = new BigInteger("0"); BigInteger pow27 = new BigInteger("1"); /*********相加编码法******************/// for(int i=key.length()-1;i>=0;i--)// { // letter = key.charAt(i);// hashKey += letter;// } /**********相加编码法*****************/ /**************相乘编码法********************/ for(int i=key.length()-1;i>=0;i--) { int letter = key.charAt(i)-96 ; BigInteger letterB = new BigInteger(String.valueOf(letter)); hashKey = hashKey.add(letterB.multiply(pow27)); pow27 = pow27.multiply(new BigInteger(String.valueOf(27))); } /**************相乘编码法********************/ return hashKey.mod(new BigInteger(String.valueOf(array.length))).intValue(); }}