| 41 | Generating all possible outputs for known input strings of a certain length and all possible keys generates too much data making impractical storage and search of such an imense database. |

| 42 | |

| 43 | To aleviate the shortcomings of this approach, we generate a number of precomputed hash chains organized as rainbow tables. |

| 44 | |

| 45 | For each table, we define a set of reduction functions R that map hash values to secret values. The reduction functions used in each table must be different. This is needed because the R functions are not the inverses of H, the crypto function, so there are sets of input data that generate the same end values. This merger of two chains makes it difficult to determine which secret value generated a certain end secret. We solve this problem by generating a series of tables of chains. The probability of two mergers to happen at the same place and continue is smaller when we have different sets of reduction functions. |

| 46 | |

| 47 | the hash function with the reduction function, chains of alternating passwords and hash values are formed. For example, if P were the set of lowercase alphabetic 6-character passwords, and hash values were 32 bits long, a chain might look like this: |

| 48 | |