You should come up with something simple to partition the problem space among different clients. For example, if the alphabet is a-z and the key length is 5, the server might just partition the work into 26 jobs: job 1: a****: compute hashes for aaaaa - azzzz job 2: b****: compute hashes for baaaa - bzzzz ... job 26: z****: compute hashes for zaaaa - zzzzz Note that it does NOT matter at all if your client number is less than 26: just hand out the jobs in a queue like fashion. Each time a client asks, give it the next available job. Granted, if you have N = 5 clients, at the last round of job hand outs 4 of the 5 clients will be idle (26 % 5 == 1). If you want to try to divide the work over N clients in such a way that each client gets EXACTLY the same amount of work, you might look at Combinations.java (next link in parent page). But, that is neither required by the problem nor important: if the job size is relatively small compared to the total size of the work (like when you divide into 26*26 jobs - 2 letters fixed), the wasted time at the last step is negligible.