view src/main/kotlin/name/blackcap/passman/Hashing.kt @ 6:711cc42e96d7

Got the list subcommand working, but needs efficiency improvements.
author David Barts <n5jrn@me.com>
date Tue, 20 Sep 2022 20:52:21 -0700
parents a6cfdffcaa94
children 698c4a3d758d
line wrap: on
line source

package name.blackcap.passman

import java.nio.ByteBuffer
import java.nio.ByteOrder
import java.nio.CharBuffer
import java.nio.charset.Charset
import java.nio.charset.StandardCharsets
import java.security.MessageDigest

object Hashing {
    private const val HASHING_ALGORITHM = "MD5"
    private val CHARSET: Charset = StandardCharsets.UTF_8

    fun hash(bytes: ByteBuffer): Long {
        val md = MessageDigest.getInstance(HASHING_ALGORITHM)
        bytes.rewind()
        md.update(bytes)
        return toLong(md.digest())
    }

    fun hash(bytes: ByteArray): Long =
        hash(ByteBuffer.wrap(bytes))

    fun hash(chars: CharArray): Long =
        hash(CHARSET.encode(CharBuffer.wrap(chars)))

    fun hash(string: String): Long =
        hash(CHARSET.encode(string))

    private fun toLong(hash: ByteArray): Long = ByteBuffer.wrap(hash).run {
        order(ByteOrder.LITTLE_ENDIAN)
        getLong(hash.size - 8)
    }
}