--- 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))
}