So I have had a common problem when setting up games of armada with my friends. When I first got into this game, I knew that I could never really expect anyone in my social circle to take the plunge with me. That meant that if I was going to have anyone to play with, I was going to need ships for my friends to borrow. Fast forward a couple of years, and I have slowly built up a sizable collection of both factions. I always have people to play against because anyone that is interested in the game can just borrow some of my stuff. My friends are happy because they get to enjoy this awesome game without having to cough up a bunch of their own dough. I have an excuse to splurge on ships for both factions. Its a win-win-win for everyone involved. However, it does lead to a common conundrum.
Lets say I set up a game with my pal Jimmy at the FLGS for Monday evening. It would be reeeeeeal nice, from my perspective, to know what ships he wants to use before hand. Otherwise, I don't know if he is gonna bring a list with 8 hammerheads, a couple of MC80s, a squadron swarm, so I would have to lug my whole collection down to the store. If I knew what he was bringing before hand, then I only need to pack up those ships. Plus I can have all the correct ship and squadron variants assembled on their pegs ready to fly. It speeds everything up. This comes with an obvious down side though. Jimmy is always gonna have the question lingering in the back of his mind, "Did he really build his list before he saw mine?" This is especially a problem if I show up with a maxed out squadron Sloane list with all of the usual fighter objectives, while Jimmy decided to try out a squadronless fleet for the first time. I have to effusively swear the entire game, "Really man, it just worked out this way. I promise I didn't sneak-a-peak and counter your build. Its just a coincidence that I under bid you by 1 point." Worse still, it taints my victories. When I inevitably stomp his fleet into the dirt, Jimmy's not going to be thinking to himself, "Man, sodaburbles had a really good list, and he flew it brilliantly. He deserved that win." No, as he leaves the store he's muttering under his breath, "that cheeky bastard totally looked at my list."
Of course the way around this is to take the moral high ground and send him my list before I even ask for his. This works out fine for me. I don't have to carry around all of my space ships. I can play without the weight of any suspicions, and both of us know that I won fair and square at the end of the game (because of course I am still going to win). But this doesn't really address the underlying issue. It just switches our roles in this awkward social dance. I've just bought my conscience clear by foisting the same moral and social quandaries on poor Jimmy (*shakes head in disappointment* poor poor jimmy).
Clearly I am making a bigger deal out of this than it really is. I've just stuck with sending my list to my friends first. My friends aren't shady cheaters (at least I hope not). Even if they do cheat a little bit and look at my list, its not a big deal. They could use the help anyway.
And so this is how the past few years of games have gone. That is until an idea struck me at work not long ago. You see, I am a software developer by day, and an important concept that every CS grad learns at university is the utility of hashes. A hash algorithm is just a way of taking some input data, and turning it into a seemingly random sequence of letters and numbers. For example the md5 hash of the previous sentence is "261f75c3c763c492705673488d0587e7" (md5 is the name of a particular hashing algorithm). Hashes have a few important properties. The key ones for our purposes are:
1) They are deterministic. So inputting the same data to the same hash algorithm will yield the same hash.
2) If someone changes the input even slightly, then the output of the hash will be wildly different. For example, hashing the same sentence as above, but without the period gives you: "9d4307c9761d5b12654f4da9c7a56a70"
3) They are (for the most part) irreversible. If someone has a hash without the input used to generate it, it is virtually impossible for them to reconstruct the original input.
A common way hashes get used is to verify the integrity of files. For example, after you download a video game on steam, steam likely computes the hash of the files you downloaded, and then compares those hashes against what steam's servers say the hashes for those files should be. If the hashes don't line up, then some of the data might have been corrupted as it beamed to your desktop over the internet. Then steam can attempt to download the file again to correct the error. My day dream at work was that we can do something similar with our armada lists.
Without further ado, here is my solution for how to avoid the "awkward situation" with Jimmy. First, write the list you want to use in your game. Then, compute the hash value for your list. It is very easy to find websites that will do this computation for you. Searching google for "hash calculator" or "hash generator" returns lots of results. Then, send the hash value to Jimmy. You will need to tell him the hash algorithm you used too. Next, ask for Jimmy's list. Once you receive his list, you can then send him your list. Jimmy can then recompute the hash of the list you sent him.
There are then two possible situations. If the hashes do not match, then you must have modified your list in the time since you sent him the original hash value, and Jimmy should probably find some better friends. If the hashes are a match, then Jimmy can rest assured that all is right in the world; he has an honest friend that did not cheat him at a friendly game of models and dice.
A couple of notes about the above transaction: First, providing the hash to Jimmy certifies to him that you have finished writing your list. If you send him a random hash value without having actually written your list, then it will be impossible for you to create a list that counters Jimmy's and also hashes to the same random value you sent him. Second, Jimmy will not know what your list is while he is writing his. He only has the hash of your list, and since hashes are irreversible, he will not be able to reconstruct your original list.
If you have made it to this point, then you are probably thinking to your self, "But sodaburbles, this sounds like an awful lot of trouble to go to. Shouldn't you just be more trusting of your friends?" ...Yes... yes, you are absolutely correct.