If you can load from within zip files - its a very easy format to parse - you can see the precalculated crcs.
Other hashes like md5 can take considerably longer to compute.
A file has four key attributes - name, crc/hash, length and last-modified.
Jumpiing ahead to a world where you have some kind of physfs:
If you are the owner of the game, the datestamp is useful when there is a name collision - if you have 2 archer.xmls, the newer is the one you want. Then others join the game, and they send up a total bytes, number of files and a compund hash of all crcs. If it differs, we know we need to sync more and you can send the names, lengths and crcs of all files.
Finally to sync files you can of course send them over the game link, or give the location of files on a server. I'm a fan of using the game link, so that you can play unreleased mods.
In glestng I envisage storing all the files you have to download in a .cache folder with the crc mangled into the name.