How are you initially populating the hash? Surely, you are not just typing in all the hash values into the script to populate it. It would be at this point where I would be insuring that "duplicate" things don't ever make it into the hash. For instance if it were a just a comma delimited ascii file, I would probably have another hash that collects the information that needs to be unique,concatenate it all together into the second hashes keys, and then check against that before allowing the data to be placed in the initial
%students hash. I would do something similar if it were coming from a database, or another source.
If you give us an idea of how the hash is initially populated, I think some monk will be better able to answer your question. Otherwise you can just take all the hash values and compare them against each other for each student and delete the ones that match exactly.
-enlil