50 lines
1.4 KiB
Go
50 lines
1.4 KiB
Go
|
|
package basic
|
||
|
|
|
||
|
|
import (
|
||
|
|
"crypto/sha256"
|
||
|
|
"encoding/binary"
|
||
|
|
"encoding/hex"
|
||
|
|
"math"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
// starCatalogDigestWant 解码后星表的摘要,锁定逐位一致。
|
||
|
|
const starCatalogDigestWant = "6a538c97a35dfc9fd2ecad2268ec9a15c3efa1bf4f9ee1cff752448c9c5a7a53"
|
||
|
|
|
||
|
|
func starCatalogDigest(stars []StarData) string {
|
||
|
|
hash := sha256.New()
|
||
|
|
var buf [8]byte
|
||
|
|
writeUint := func(v uint64) {
|
||
|
|
binary.LittleEndian.PutUint64(buf[:], v)
|
||
|
|
hash.Write(buf[:])
|
||
|
|
}
|
||
|
|
writeString := func(s string) {
|
||
|
|
writeUint(uint64(len(s)))
|
||
|
|
hash.Write([]byte(s))
|
||
|
|
}
|
||
|
|
writeUint(uint64(len(stars)))
|
||
|
|
for _, star := range stars {
|
||
|
|
writeUint(uint64(star.HR))
|
||
|
|
writeUint(uint64(star.HD))
|
||
|
|
writeUint(uint64(star.HIP))
|
||
|
|
writeString(star.Name)
|
||
|
|
for _, v := range []float64{star.Ra, star.Dec, star.Mag, star.PmRA, star.PmDec, star.RadVel, star.RotVel, star.Pc} {
|
||
|
|
writeUint(math.Float64bits(v))
|
||
|
|
}
|
||
|
|
for _, s := range []string{star.ChineseName, star.ChineseAlias, star.ChineseBayerName, star.CommonName,
|
||
|
|
star.CommonAliasName, star.Cst, star.CstChinese} {
|
||
|
|
writeString(s)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return hex.EncodeToString(hash.Sum(nil))
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestStarCatalogDigestMatchesLegacyParser(t *testing.T) {
|
||
|
|
if err := LoadStarData(); err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if got := starCatalogDigest(cachedStarData); got != starCatalogDigestWant {
|
||
|
|
t.Fatalf("star catalog digest = %s, want %s", got, starCatalogDigestWant)
|
||
|
|
}
|
||
|
|
}
|