maxim.shafirov
05/06/2016, 2:41 PMimport kotlin.system.measureTimeMillis
import java.security.MessageDigest
import javax.xml.bind.DatatypeConverter
val messageDigest = MessageDigest.getInstance("SHA-256")
fun ByteArray.toHex(): String {
return DatatypeConverter.printHexBinary(this).toLowerCase()
}
fun digest(data: String): String {
return messageDigest.digest(data.toByteArray()).toHex()
}
class PairerIterator(val source: Iterator<String>) : Iterator<Pair<String, String>> {
override fun hasNext() = source.hasNext()
override fun next(): Pair<String, String> {
val a = source.next()
val b = if (source.hasNext()) source.next() else a
return a to b
}
}
fun pair(collection: Sequence<String>): Sequence<Pair<String, String>> {
return Sequence {
PairerIterator(collection.iterator())
}
}
fun digestPairs(collection: Sequence<Pair<String, String>>): Sequence<Pair<String, String>> {
return pair(collection.map {
digest(it.first + it.second)
})
}
fun main(args: Array<String>) {
val pairItems = (1 .. 10000000).asSequence().map {
val a = it.toString()
a to a
}
println("done building list")
println(measureTimeMillis {
var items = digestPairs(pairItems).toList()
while (items.size != 1) {
println(items.size)
items = digestPairs(items.asSequence()).toList()
}
println(digest(items.first().first + items.first().second))
})
}