Adding an option to set the digest function that everything uses. Minor refactoring: enabling potential fast digest computation of more than one digest function type.
Usage: bazel --host_jvm_args="-Dbazel.DigestFunction=SHA1" build ...

Ugliness: using a system property (a static non-final variable), because the better way to do it (a flag) would result in a much, much larger refactoring.

More ugliness: I have updated the minimal amount of tests. A lot of tests are still relying on the default value of MD5. Ideally, they need to be updated as well.

--
MOS_MIGRATED_REVID=139490836
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/Path.java b/src/main/java/com/google/devtools/build/lib/vfs/Path.java
index 6599952..e039efe 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/Path.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/Path.java
@@ -19,6 +19,7 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.lib.util.StringCanonicalizer;
+import com.google.devtools.build.lib.vfs.FileSystem.HashFunction;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
@@ -1039,19 +1040,26 @@
   }
 
   /**
-   * Returns the type of digest that may be returned by {@link #getFastDigest}, or {@code null}
-   * if the filesystem doesn't support them.
+   * Gets a fast digest for the given path, or {@code null} if there isn't one available. The
+   * digest should be suitable for detecting changes to the file.
    */
-  public String getFastDigestFunctionType() {
-    return fileSystem.getFastDigestFunctionType(this);
+  public byte[] getFastDigest() throws IOException {
+    return fileSystem.getFastDigest(this);
   }
 
   /**
    * Gets a fast digest for the given path, or {@code null} if there isn't one available. The
    * digest should be suitable for detecting changes to the file.
    */
-  public byte[] getFastDigest() throws IOException {
-    return fileSystem.getFastDigest(this);
+  public byte[] getFastDigest(HashFunction hashFunction) throws IOException {
+    return fileSystem.getFastDigest(this, hashFunction);
+  }
+
+  /**
+   * Returns whether the given digest is a valid digest for the default system digest function.
+   */
+  public boolean isValidDigest(byte[] digest) {
+    return fileSystem.isValidDigest(digest);
   }
 
   /**
@@ -1083,6 +1091,28 @@
   }
 
   /**
+   * Returns the digest of the file denoted by the current path,
+   * following symbolic links.
+   *
+   * @return a new byte array containing the file's digest
+   * @throws IOException if the digest could not be computed for any reason
+   */
+  public byte[] getDigest() throws IOException {
+    return fileSystem.getDigest(this);
+  }
+
+  /**
+   * Returns the digest of the file denoted by the current path and digest function,
+   * following symbolic links.
+   *
+   * @return a new byte array containing the file's digest
+   * @throws IOException if the digest could not be computed for any reason
+   */
+  public byte[] getDigest(HashFunction hashFunction) throws IOException {
+    return fileSystem.getDigest(this, hashFunction);
+  }
+
+  /**
    * Opens the file denoted by this path, following symbolic links, for reading,
    * and returns an input stream to it.
    *