private byte[] getHash(JarArchive jarArchive) {
   FileSnapshot s = inputFilesSnapshot.findSnapshot(jarArchive.file);
   if (s != null) {
     return s.getHash();
   }
   return hasher.hash(jarArchive.file);
 }
 private byte[] hash(
     List<String> visitedFilePaths, Set<File> visitedDirs, byte[] combinedHash, File[] toHash) {
   for (File file : toHash) {
     file = GFileUtils.canonicalise(file);
     if (file.isDirectory()) {
       if (visitedDirs.add(file)) {
         // in theory, awkward symbolic links can lead to recursion problems.
         // TODO - figure out a way to test it. I only tested it 'manually' and the feature is
         // needed.
         combinedHash = hash(visitedFilePaths, visitedDirs, combinedHash, file.listFiles());
       }
     } else {
       visitedFilePaths.add(file.getAbsolutePath());
       combinedHash = Bytes.concat(combinedHash, hasher.hash(file));
     }
   }
   return combinedHash;
 }