1. Our family has m functions: for each i in the range [0, m - 1], it contains the function h(x) = i. We see that given any object x, applying a random function h from H will have a equal chance of mapping it to any bucket. However, if we take two objects and apply the same function, they will always collide. 2. From section 3 of the hashing notes, the formula is m = n * - (ln epsilon) / (ln 2)^2. Plugging in epsilon = 0.1, we get m = 4.8n. Plugging in epsilon = 0.0001, we get m = 19.2n. We see that we can get extremely low tolerance values, and it does not substantially increase the number of buckets we need.