- import java.security.MessageDigest;
- import scala.annotation._
- import sbt._
- import sbt.Using._
-
- object Checksums {
- private val bufferSize = 2048
-
- def generate(source:File, target:File, algorithm:String):Unit =
- 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() {
- 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 ""
- }