55 lines
1.1 KiB
Go
55 lines
1.1 KiB
Go
package sha256
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"fmt"
|
|
"sort"
|
|
"strings"
|
|
|
|
"git.andreafazzi.eu/andrea/probo/client"
|
|
"git.andreafazzi.eu/andrea/probo/hasher"
|
|
)
|
|
|
|
var DefaultSHA256HashingFn = func(text string) string {
|
|
return fmt.Sprintf("%x", sha256.Sum256([]byte(text)))
|
|
}
|
|
|
|
type Default256Hasher struct {
|
|
hashFn hasher.HashFunc
|
|
}
|
|
|
|
func NewDefault256Hasher(hashFn hasher.HashFunc) *Default256Hasher {
|
|
return &Default256Hasher{hashFn}
|
|
}
|
|
|
|
func (h *Default256Hasher) QuizHashes(quiz *client.Quiz) []string {
|
|
result := make([]string, 0)
|
|
|
|
result = append(result, h.QuestionHash(quiz.Question))
|
|
|
|
for _, a := range quiz.Answers {
|
|
result = append(result, h.AnswerHash(a))
|
|
}
|
|
|
|
result = append(result, h.Calculate(result))
|
|
|
|
return result
|
|
}
|
|
|
|
func (h *Default256Hasher) QuestionHash(question *client.Question) string {
|
|
return h.hashFn(question.Text)
|
|
}
|
|
|
|
func (h *Default256Hasher) AnswerHash(answer *client.Answer) string {
|
|
return h.hashFn(answer.Text)
|
|
}
|
|
|
|
func (h *Default256Hasher) Calculate(hashes []string) string {
|
|
orderedHashes := make([]string, len(hashes))
|
|
|
|
copy(orderedHashes, hashes)
|
|
sort.Strings(orderedHashes)
|
|
|
|
return h.hashFn(strings.Join(orderedHashes, ""))
|
|
}
|
|
-
|