CSC 103 Lecture Notes Week 5
Hashing
[ "Baker", "Doe", "Jones", "Smith" ]
[ {"Baker, Mary", 51, 549886295, "123 Main St."},
  {"Doe, John", 28, 861483372,"456 1st Ave."},
  ...
]
class InformationRecord {
    String name;        // Person name
    int age;            // Age
    int id;             // Unique id
    String address;     // Home address
}
Allocate an array of the desired table size and provide a function that maps any key into the range 0 to TableSize-1.
 
Figure 1: Hash table with entries at 6295 and 3372.
and then compute the modulus.char[0] + (27 * char[1]) + (729 * char[2])
where 37 is the empirically-derived constant and l = the string length of the key.(37 * char[0]) + (372 * char[1]) + ... + (37(l-1) * char[l])
/****
 *
 * Class Hashing contains three different string-valued hash functions, as
 * discussed in Lecture Notes Week 5.
 *
 * @author Gene Fisher (gfisher@calpoly.edu)
 * @version 1may01
 */
public class Hashing {
    /**
     * Compute a hash index for the given string by summing the string
     * characters and taking the modulus of the given table size.
     */
    public static int hash1(String key, int tableSize) {
        int hashVal = 0;
        for (int i = 0; i < key.length(); i++) {
            hashVal += key.charAt(i);
        }
        return hashVal % tableSize;
    }
    /**
     * Compute a hash index for the given string by summing the first three
     * string characters with the formula:
     *
     *     char[0] + (27 * char[1]) + (729 * char[2])
     *
     * where 27 is the number of letter in the alphabet + 1 for a blank, and
     * 729 is 27<sup>2</sup>.
     *
     * Return the sum mod the given table size.
     */
    public static int hash2(String key, int tableSize) {
        int hashVal = 0;
        return (key.charAt(0) + (27 * key.charAt(1)) + (729 * key.charAt(2)))
            % tableSize;
    }
    /**
     * Compute a hash index for the given string by summing all of the string
     * characters with the formula:
     *
     *     (37 * char[0]) + (37^2 * char[1]) + ... + (37^(l-1) * char[l])
     *
     * where 37 is an empirically chosen value to provide good distribution and
     * l = key.length().
     *
     * Return the sum mod the given table size.
     */
    public static int hash3(String key, int tableSize) {
        int hashVal = 0;
        for (int i = 0; i < key.length(); i++) {
            hashVal = 37 * hashVal + key.charAt(i);
        }
        hashVal %= tableSize;
        if (hashVal < 0) {
            hashVal += tableSize;
        }
        return hashVal;
    }
}