more SHA1.digest operations;
authorwenzelm
Wed, 18 Jul 2012 20:59:02 +0200
changeset 48343 3060e6343953
parent 48342 4a8f06cbf8bb
child 48344 8dc904c45945
child 48356 b6081af563a9
more SHA1.digest operations;
src/Pure/General/sha1.scala
--- a/src/Pure/General/sha1.scala	Wed Jul 18 20:55:19 2012 +0200
+++ b/src/Pure/General/sha1.scala	Wed Jul 18 20:59:02 2012 +0200
@@ -8,6 +8,7 @@
 package isabelle
 
 
+import java.io.{File, FileInputStream}
 import java.security.MessageDigest
 
 
@@ -18,10 +19,10 @@
     override def toString: String = rep
   }
 
-  def digest_bytes(bytes: Array[Byte]): Digest =
+  private def make_result(digest: MessageDigest): Digest =
   {
     val result = new StringBuilder
-    for (b <- MessageDigest.getInstance("SHA").digest(bytes)) {
+    for (b <- digest.digest()) {
       val i = b.asInstanceOf[Int] & 0xFF
       if (i < 16) result += '0'
       result ++= Integer.toHexString(i)
@@ -29,6 +30,32 @@
     Digest(result.toString)
   }
 
-  def digest(s: String): Digest = digest_bytes(Standard_System.string_bytes(s))
+  def digest(file: File): Digest =
+  {
+    val stream = new FileInputStream(file)
+    val digest = MessageDigest.getInstance("SHA")
+
+    val buf = new Array[Byte](65536)
+    var m = 0
+    try {
+      do {
+        m = stream.read(buf, 0, buf.length)
+        if (m != -1) digest.update(buf, 0, m)
+      } while (m != -1)
+    }
+    finally { stream.close }
+
+    make_result(digest)
+  }
+
+  def digest(bytes: Array[Byte]): Digest =
+  {
+    val digest = MessageDigest.getInstance("SHA")
+    digest.update(bytes)
+
+    make_result(digest)
+  }
+
+  def digest(string: String): Digest = digest(Standard_System.string_bytes(string))
 }