Ok listen... my encryption method is 100% unique to the players. The shuffling is based off of a modified hash from the player's nickname. This player uniqueness adds 0 data to the code. It's just a simple StringHash though and convert to base 8 and add 1 to all the digits of 0 ; P.
So no, you don't need 3 digits for the hash for the player's nick. You need 0 ; P.
The only thing you need are the 15 binary digits and you are done = ). Let the encryption do the checksum and yea, you're set ; P. Custom Hero Foots uses similar save/load techniques (although it's a bit more advanced in that map since they have player unique checksums and bases as well) and it has yet to be cracked (and believe me, there was a guy doing all he could to crack it).
For player unique bases
encryptionKey = BigInt that just converts the base into a string (flip 0 with 1 in front)
baseEncryptionKey = the encryption key as a base
JASS:
call Scramble(encryptionKey,playerId,3,baseEncryptionKey,true)
set bases[playerId]=Base[encryptionKey.toString()]
From here, you use a player unique base when generating your number, thus most players have a different base (numbers are totally different).
The next thing is player unique checksums, which uses variance in checksums between players that I won't go into = P.
The only thing that the encrypt function does is a checksum (not player unique) with scrambling (player unique). I could add the other 2 security features if you want though =).
This is the equation for player unique checksums where CHECKSUM_VARIANCE is some constant (suggested .85) and maxChecksum is the security value (6-7 digits). PLAYER_CHECKSUM_SALT is a constant string that just muddles the player name (different checksum).
Code:
checksum=StringHash(StringCase(GetPlayerName(player)+PLAYER_CHECKSUM_SALT,false))
if (0>checksum) then
set checksum=-checksum
endif
minChecksum=R2I(maxChecksum*CHECKSUM_VARIANCE)
checksumRange=maxChecksum-minChecksum
checksum=checksum-checksum/checksumRange*checksumRange+minChecksum
Again, the only thing my encrypt function has is scrambling. The other 2 techniques mentioned in this post are not in it.
Oh and these are your 15 binary digits max in base 36
9ZLDR or 5 digits, meaning that with the checksum, you're looking at around 5Y3CGMWG0, or 8 digits (1000000 checksum).
100000 would be LEQG2AG0, still 8 digits.
edit
wrote a couple of other useful snippets
http://www.hiveworkshop.com/forums/1993499-post523.html
http://www.hiveworkshop.com/forums/1993669-post524.html
edit
My NumberEncrypter thing now does all 3 encryption techniques ^)^
player unique bases
player unique checksums
player unique scrambling
It still bases stuff on simple StringHash though