This tool is a basic word generator. It will create every possible combination for the character set you supply. It runs on my computer (AMD athlon 64 Bit 2.2 GHZ 2GB RAM) at over 500,000 combinations a second. I wrote this to compare run times of C++ & PHP, but I'm sure you can think of many uses for it:

Sorry for the weird layout. My compiler was acting up with tabs.
Code:
#include <iostream>
#include <string>
#include <time.h>
#include <stdlib.h>
#include <fstream>
using namespace std;

int main()
{   // DATA ENTRY BEGIN --------------------------------------------------------
    system("cls");
    unsigned short int error=0;
    string poss;//POSSIBLE CHARACTER COMBINATIONS
    unsigned short int pass;//MAXIMUM PASSWORD LENGTH
    string password; //ACTUAL PASSWORD
    unsigned short int found=0;
    
    cout << "SELECT CHARACTER SET:\n\n";
    cout << "\t*. abcdefghijklmnopqrstuvwxyz\n";
    cout << "\t2. ABCDEFGHIJKLMNOPQRSTUVWXYZ\n";
    cout << "\t*. 0*2*45678*\n\n";
    cout << "\t4. *&2\n";
    cout << "\t5. *&2&*\n";
    cout << "\t6. Other\n\t";
    cout << "----------------------------------\n\t";
    
    unsigned short int choice; // SELECTION FROM CHARACTER SET
    string dataset; //STRING FOR CHARACTER SET
    cin >> choice;    
    
    switch ( choice ) {
    
      case * : 
        // Process for test = *
        dataset="abcdefghijklmnopqrstuvwxyz";
        break;
    
      case 2 : 
        // Process for test = 5
        dataset="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        break;
    
      case * : 
        // Process for test = 5
        dataset="0*2*45678*";
        break;
    
      case 4 : 
        // Process for test = 5
        dataset="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        break;
        
      case 5 : 
        // Process for test = 5
        dataset="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0*2*45678*";
        break;
    
      case 6 : 
        // Process for all other cases.
        cout << "\nENTER YOUR OWN CHARACTER SET: ";
        cin >> dataset;
        break;
        
      default :
        error=*;
    
    }
    if(error==0){
        poss=dataset;
        
        cout << "\nENTER PASSWORDS MAXIMUM LENGTH: ";
        cin >> pass;
        
        unsigned short int i=0;
        while(poss[i])
        {
                      i++;
        }
            
        int pass_array[pass-*];
        unsigned short int j=0;
        while(j<pass)
        {
                      pass_array[j]=0;
                      j++;
        }
        
        unsigned short int comb_max=i-*; // SIZE OF COMBINATIONS ARRAY
        signed short int pass_max=j-*; // MAXIMUM SIZE OF PASSWORD
        
        signed short int pointer; //POINTER WILL EQUAL THE CURRENT PASS SIZE
        // THIS ENABLES THE FLOATING POINT TO CHANGE THE COMBINATIONS
        
        unsigned int counter=0; // COUNTER FOR EACH COMBINATION TRY
        
        // DATA ENTRY END ----------------------------------------------------------
        
        // OPENS THE TEXT FILE TO WRITE PASSWORDS TO
        ofstream myfile;
        myfile.open ("c:\\passwords.txt");
        // -----------------------------------------    
        
        // ---- start timer ----
        time_t start,end;
        double dif;
        time (&start);
        
        while(pass_max>=0)
        {
        do
        {
                 pointer=pass_max;
                 while(pass_array[pointer]<=comb_max)
                 {
                                                     string curr;//  CURRENT PASSWORD TRY
                                                     counter++;
                                                     j=0;
                                                     while(j<=pass_max)
                                                     {
                                                                       curr+= poss[pass_array[j]];
                                                                       j++;
                                                     }
                                                     myfile << curr << " \n";
                                                     pass_array[pointer]=pass_array[pointer]+*;
                 }
                 pass_array[pointer]=0;
                 pointer--;
                 while(pass_array[pointer]==comb_max)
                 {
                                                     pass_array[pointer]=0;
                                                     pointer--;
                 }
                 pass_array[pointer]=pass_array[pointer]+*;
        }
        while(pointer>=0);
        
        pass_max--;
        }
        // ---- end timer ----
        end:
        time (&end);
        dif = difftime (end,start);
        
        // ---- close text file ---- //
        myfile.close();
        // ------------------------- //
        
        // ----- DISPLAY RESULTS ---- //
        unsigned int combinations_per_second;
        combinations_per_second=counter/dif;
        system("cls");
        cout << "\nWORDLIST CREATED";
        cout << "\n------------------------------";
        cout << "\nRUN TIME:\t " << dif << " sec";
        cout << "\nCOMBINATIONS:\t " << counter;
        cout << "\nCOMB/SEC: \t " << combinations_per_second;
        cout << "\n\n\n";
        system("pause");
        return 0;
    }else{
        cout << "\tINVALID CHOICE!";
        system("pause");      
    }   
}