aboutsummaryrefslogtreecommitdiff
path: root/common/shared/src/main/scala/Message.scala
blob: 7ee36cb71d326f16db6131433db338bf555cb61e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package triad

import java.security.MessageDigest
import java.time.Instant

case class Message(content: String,
                   author: String,
                   timestamp: Instant = Instant.now()) {

  lazy val id: String = {
    val digest = MessageDigest.getInstance("SHA-256")
    digest.update(content.getBytes)
    digest.update(author.getBytes)
    digest.update((timestamp.getEpochSecond & 0xff).toByte)
    digest.update(((timestamp.getEpochSecond >> 8) & 0xff).toByte)
    digest.update(((timestamp.getEpochSecond >> 16) & 0xff).toByte)
    digest.update(((timestamp.getEpochSecond >> 24) & 0xff).toByte)
    digest.update(((timestamp.getEpochSecond >> 32) & 0xff).toByte)
    digest.update(((timestamp.getEpochSecond >> 40) & 0xff).toByte)
    digest.update(((timestamp.getEpochSecond >> 48) & 0xff).toByte)
    digest.update(((timestamp.getEpochSecond >> 56) & 0xff).toByte)
    Message.bytesToHex(digest.digest())
  }

}

object Message {
  private def bytesToHex(hash: Array[Byte]): String = {
    val hexString = new StringBuffer(hash.length * 2)
    var i = 0
    while (i < hash.length) {
      val hex = Integer.toHexString(0xff & hash(i))
      if (hex.length == 1) hexString.append('0')
      hexString.append(hex)
      i += 1
    }
    hexString.toString
  }
}