sha256.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package sha256
  2. import (
  3. "crypto/sha256"
  4. "fmt"
  5. "sort"
  6. "strings"
  7. "git.andreafazzi.eu/andrea/probo/client"
  8. "git.andreafazzi.eu/andrea/probo/hasher"
  9. )
  10. var DefaultSHA256HashingFn = func(text string) string {
  11. return fmt.Sprintf("%x", sha256.Sum256([]byte(text)))
  12. }
  13. type Default256Hasher struct {
  14. hashFn hasher.HashFunc
  15. }
  16. func NewDefault256Hasher(hashFn hasher.HashFunc) *Default256Hasher {
  17. return &Default256Hasher{hashFn}
  18. }
  19. func (h *Default256Hasher) QuizHashes(quiz *client.Quiz) []string {
  20. result := make([]string, 0)
  21. result = append(result, h.QuestionHash(quiz.Question))
  22. for _, a := range quiz.Answers {
  23. result = append(result, h.AnswerHash(a))
  24. }
  25. result = append(result, h.Calculate(result))
  26. return result
  27. }
  28. func (h *Default256Hasher) QuestionHash(question *client.Question) string {
  29. return h.hashFn(question.Text)
  30. }
  31. func (h *Default256Hasher) AnswerHash(answer *client.Answer) string {
  32. return h.hashFn(answer.Text)
  33. }
  34. func (h *Default256Hasher) Calculate(hashes []string) string {
  35. orderedHashes := make([]string, len(hashes))
  36. copy(orderedHashes, hashes)
  37. sort.Strings(orderedHashes)
  38. return h.hashFn(strings.Join(orderedHashes, ""))
  39. }