adds hex serialization methods to ImageHash

The ToString and FromString methods create a string representation
of an ImageHash, following the format:
`<first letter of type>:<hex representation of hash`
This commit is contained in:
Gustavo Brunoro 2017-11-14 19:53:03 -02:00 committed by Dong-hee Na
parent 22bcbf7685
commit 40b64eda79

View File

@ -6,20 +6,21 @@ package goimagehash
import ( import (
"errors" "errors"
"fmt"
) )
// hashKind describes the kinds of hash. // Kind describes the kinds of hash.
type hashKind int type Kind int
// ImageHash is a struct of hash computation. // ImageHash is a struct of hash computation.
type ImageHash struct { type ImageHash struct {
hash uint64 hash uint64
kind hashKind kind Kind
} }
const ( const (
// Unknown is a enum value of the unknown hash. // Unknown is a enum value of the unknown hash.
Unknown hashKind = iota Unknown Kind = iota
// AHash is a enum value of the average hash. // AHash is a enum value of the average hash.
AHash AHash
//PHash is a enum value of the perceptual hash. //PHash is a enum value of the perceptual hash.
@ -31,14 +32,14 @@ const (
) )
// NewImageHash function creates a new image hash. // NewImageHash function creates a new image hash.
func NewImageHash(hash uint64, kind hashKind) *ImageHash { func NewImageHash(hash uint64, kind Kind) *ImageHash {
return &ImageHash{hash: hash, kind: kind} return &ImageHash{hash: hash, kind: kind}
} }
// Distance method returns a distance between two hashes. // Distance method returns a distance between two hashes.
func (h *ImageHash) Distance(other *ImageHash) (int, error) { func (h *ImageHash) Distance(other *ImageHash) (int, error) {
if h.GetKind() != other.GetKind() { if h.GetKind() != other.GetKind() {
return -1, errors.New("Image hashes's kind should be identical.") return -1, errors.New("Image hashes's kind should be identical")
} }
diff := 0 diff := 0
@ -60,7 +61,7 @@ func (h *ImageHash) GetHash() uint64 {
} }
// GetKind method returns a kind of image hash. // GetKind method returns a kind of image hash.
func (h *ImageHash) GetKind() hashKind { func (h *ImageHash) GetKind() Kind {
return h.kind return h.kind
} }
@ -68,3 +69,44 @@ func (h *ImageHash) GetKind() hashKind {
func (h *ImageHash) Set(idx int) { func (h *ImageHash) Set(idx int) {
h.hash |= 1 << uint(idx) h.hash |= 1 << uint(idx)
} }
const strFmt = "%v:%0x"
// FromString returns an image hash from a hex representation
func FromString(s string) (*ImageHash, error) {
var kindStr string
var hash uint64
_, err := fmt.Sscanf(s, strFmt, kindStr, hash)
if err != nil {
return nil, errors.New("Couldn't parse string " + s)
}
kind := Unknown
switch kindStr {
case "a":
kind = AHash
case "p":
kind = PHash
case "d":
kind = DHash
case "w":
kind = WHash
}
return NewImageHash(hash, kind), nil
}
// ToString returns a hex representation of the hash
func (h *ImageHash) ToString() string {
kindStr := ""
switch h.kind {
case AHash:
kindStr = "a"
case PHash:
kindStr = "p"
case DHash:
kindStr = "d"
case WHash:
kindStr = "w"
}
return fmt.Sprintf(strFmt, kindStr, h.hash)
}