src/Pure/General/sha1.scala
author wenzelm
Sun, 22 Jul 2012 12:26:41 +0200
changeset 49438 0ccf143a2a69
parent 49424 0d2114eb412a
child 50711 3003c87f7814
permissions -rw-r--r--
maintain set of source digests, including relevant parts of session entry;
     1 /*  Title:      Pure/General/sha1.scala
     2     Module:     PIDE
     3     Author:     Makarius
     4 
     5 Digest strings according to SHA-1 (see RFC 3174).
     6 */
     7 
     8 package isabelle
     9 
    10 
    11 import java.io.{File => JFile, FileInputStream}
    12 import java.security.MessageDigest
    13 
    14 
    15 object SHA1
    16 {
    17   sealed case class Digest(rep: String)
    18   {
    19     override def toString: String = rep
    20   }
    21 
    22   private def make_result(digest: MessageDigest): Digest =
    23   {
    24     val result = new StringBuilder
    25     for (b <- digest.digest()) {
    26       val i = b.asInstanceOf[Int] & 0xFF
    27       if (i < 16) result += '0'
    28       result ++= Integer.toHexString(i)
    29     }
    30     Digest(result.toString)
    31   }
    32 
    33   def digest(file: JFile): Digest =
    34   {
    35     val stream = new FileInputStream(file)
    36     val digest = MessageDigest.getInstance("SHA")
    37 
    38     val buf = new Array[Byte](65536)
    39     var m = 0
    40     try {
    41       do {
    42         m = stream.read(buf, 0, buf.length)
    43         if (m != -1) digest.update(buf, 0, m)
    44       } while (m != -1)
    45     }
    46     finally { stream.close }
    47 
    48     make_result(digest)
    49   }
    50 
    51   def digest(path: Path): Digest = digest(path.file)
    52 
    53   def digest(bytes: Array[Byte]): Digest =
    54   {
    55     val digest = MessageDigest.getInstance("SHA")
    56     digest.update(bytes)
    57 
    58     make_result(digest)
    59   }
    60 
    61   def digest(string: String): Digest = digest(Standard_System.string_bytes(string))
    62 }
    63