77 lines
1.8 KiB
Go
77 lines
1.8 KiB
Go
package main
|
||
|
||
import (
|
||
"crypto/hmac"
|
||
"crypto/sha256"
|
||
"encoding/binary"
|
||
"encoding/hex"
|
||
"fmt"
|
||
"sort"
|
||
)
|
||
|
||
func main() {
|
||
// 数据库查到的正确seed (活动76)
|
||
seedHex := "162B08DAC70849C68FDBF499583199B9500EE96CCCFC64511719B54FC7D9AFC9"
|
||
seed, _ := hex.DecodeString(seedHex)
|
||
|
||
issueID := int64(83)
|
||
userID := int64(9054)
|
||
saltHex := "c4e144b991600f5a5a316d55b6929d19"
|
||
|
||
// payload格式
|
||
payload := fmt.Sprintf("draw:issue:%d|user:%d|salt:%s", issueID, userID, saltHex)
|
||
fmt.Printf("Seed: %s\n", seedHex)
|
||
fmt.Printf("Payload: %s\n", payload)
|
||
|
||
mac := hmac.New(sha256.New, seed)
|
||
mac.Write([]byte(payload))
|
||
sum := mac.Sum(nil)
|
||
|
||
totalWeight := int64(100000)
|
||
rnd := int64(binary.BigEndian.Uint64(sum[:8]) % uint64(totalWeight))
|
||
|
||
fmt.Printf("HMAC: %x\n", sum)
|
||
fmt.Printf("计算随机数: %d\n", rnd)
|
||
fmt.Printf("数据库记录: 90555\n")
|
||
|
||
if rnd == 90555 {
|
||
fmt.Println("\n✅ 随机数匹配!")
|
||
} else {
|
||
fmt.Println("\n❌ 随机数不匹配")
|
||
}
|
||
|
||
// 用计算的随机数选择奖品
|
||
// 用计算的随机数选择奖品
|
||
weights := []struct {
|
||
ID int64
|
||
Weight int64
|
||
Name string
|
||
}{
|
||
{280, 88200, "捏捏"},
|
||
{281, 100, "魔灵高达"},
|
||
{282, 6500, "高达徽章"},
|
||
{283, 3200, "打磨工具五件套"},
|
||
{284, 800, "SD随机款"},
|
||
{285, 800, "EG创制强袭高达"},
|
||
{286, 100, "V2高达AB型"},
|
||
{429, 100, "EG创制强袭超银河"},
|
||
{430, 100, "战国异端顽驮无"},
|
||
{431, 100, "牛高达"},
|
||
}
|
||
|
||
// 按ID排序(模拟后端逻辑)
|
||
sort.Slice(weights, func(i, j int) bool {
|
||
return weights[i].ID < weights[j].ID
|
||
})
|
||
|
||
var acc int64
|
||
for _, w := range weights {
|
||
acc += w.Weight
|
||
if rnd < acc {
|
||
fmt.Printf("\n计算中奖: ID %d (%s)\n", w.ID, w.Name)
|
||
break
|
||
}
|
||
}
|
||
fmt.Println("数据库实际: ID 282 (高达徽章)")
|
||
}
|