mirror of https://github.com/sbt/sbt.git
use Hash in util/io
This commit is contained in:
parent
883bcfb200
commit
1351177172
|
|
@ -1,79 +0,0 @@
|
||||||
/* sbt -- Simple Build Tool
|
|
||||||
* Copyright 2009 Mark Harrah
|
|
||||||
*/
|
|
||||||
package sbt
|
|
||||||
|
|
||||||
import java.io.{ByteArrayInputStream, File, InputStream}
|
|
||||||
|
|
||||||
object Hash
|
|
||||||
{
|
|
||||||
private val BufferSize = 8192
|
|
||||||
def toHex(bytes: Array[Byte]): String =
|
|
||||||
{
|
|
||||||
val buffer = new StringBuilder(bytes.length * 2)
|
|
||||||
for(i <- 0 until bytes.length)
|
|
||||||
{
|
|
||||||
val b = bytes(i)
|
|
||||||
val bi: Int = if(b < 0) b + 256 else b
|
|
||||||
buffer append toHex((bi >>> 4).asInstanceOf[Byte])
|
|
||||||
buffer append toHex((bi & 0x0F).asInstanceOf[Byte])
|
|
||||||
}
|
|
||||||
buffer.toString
|
|
||||||
}
|
|
||||||
def fromHex(hex: String): Array[Byte] =
|
|
||||||
{
|
|
||||||
require((hex.length & 1) == 0, "Hex string must have length 2n.")
|
|
||||||
val array = new Array[Byte](hex.length >> 1)
|
|
||||||
for(i <- 0 until hex.length by 2)
|
|
||||||
{
|
|
||||||
val c1 = hex.charAt(i)
|
|
||||||
val c2 = hex.charAt(i+1)
|
|
||||||
array(i >> 1) = ((fromHex(c1) << 4) | fromHex(c2)).asInstanceOf[Byte]
|
|
||||||
}
|
|
||||||
array
|
|
||||||
}
|
|
||||||
/** Calculates the SHA-1 hash of the given String.*/
|
|
||||||
def apply(s: String, log: Logger): Either[String, Array[Byte]] = apply(new ByteArrayInputStream(s.getBytes("UTF-8")), log)
|
|
||||||
/** Calculates the SHA-1 hash of the given file.*/
|
|
||||||
def apply(path: Path, log: Logger): Either[String, Array[Byte]] = apply(path.asFile, log)
|
|
||||||
/** Calculates the SHA-1 hash of the given file.*/
|
|
||||||
def apply(file: File, log: Logger): Either[String, Array[Byte]] =
|
|
||||||
FileUtilities.readStreamValue(file, log) { stream => apply(stream, log) }
|
|
||||||
/** Calculates the SHA-1 hash of the given stream, closing it when finished.*/
|
|
||||||
def apply(stream: InputStream, log: Logger): Either[String, Array[Byte]] =
|
|
||||||
{
|
|
||||||
import java.security.{MessageDigest, DigestInputStream}
|
|
||||||
val digest = MessageDigest.getInstance("SHA")
|
|
||||||
Control.trapAndFinally("Error computing digest: ", log)
|
|
||||||
{
|
|
||||||
val dis = new DigestInputStream(stream, digest)
|
|
||||||
val buffer = new Array[Byte](BufferSize)
|
|
||||||
while(dis.read(buffer) >= 0) {}
|
|
||||||
dis.close()
|
|
||||||
Right(digest.digest)
|
|
||||||
}
|
|
||||||
{ stream.close() }
|
|
||||||
}
|
|
||||||
|
|
||||||
private def toHex(b: Byte): Char =
|
|
||||||
{
|
|
||||||
require(b >= 0 && b <= 15, "Byte " + b + " was not between 0 and 15")
|
|
||||||
if(b < 10)
|
|
||||||
('0'.asInstanceOf[Int] + b).asInstanceOf[Char]
|
|
||||||
else
|
|
||||||
('a'.asInstanceOf[Int] + (b-10)).asInstanceOf[Char]
|
|
||||||
}
|
|
||||||
private def fromHex(c: Char): Int =
|
|
||||||
{
|
|
||||||
val b =
|
|
||||||
if(c >= '0' && c <= '9')
|
|
||||||
(c - '0')
|
|
||||||
else if(c >= 'a' && c <= 'f')
|
|
||||||
(c - 'a') + 10
|
|
||||||
else if(c >= 'A' && c <= 'F')
|
|
||||||
(c - 'A') + 10
|
|
||||||
else
|
|
||||||
throw new RuntimeException("Invalid hex character: '" + c + "'.")
|
|
||||||
b
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue