- import java.security.MessageDigest
- import scala.annotation._
- import sbt._
- import io._
-
- object Checksums {
- private val bufferSize = 2048
-
- def generate(source: File, target: File, algorithm: String): Unit =
- sbt.IO write (target, compute(source, algorithm))
-
- def compute(file: File, algorithm: String): String =
- hex(raw(file, algorithm))
-
- def raw(file: File, algorithm: String): Array[Byte] =
- (Using fileInputStream file) { is =>
- val md = MessageDigest getInstance algorithm
- val buf = new Array[Byte](bufferSize)
- md.reset()
- @tailrec
- def loop(): Unit = {
- val len = is read buf
- if (len != -1) {
- md update (buf, 0, len)
- loop()
- }
- }
- loop()
- md.digest()
- }
-
- def hex(bytes: Array[Byte]): String =
- bytes map { it =>
- "%02x" format (it.toInt & 0xff)
- } mkString ""
- }