analysis.go 982 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package table
  2. import (
  3. "fmt"
  4. "hash/crc32"
  5. "strconv"
  6. "gorm.io/gorm"
  7. )
  8. // Crc32Hash 用于32张分表
  9. func Crc32Hash(src string) string {
  10. sum := crc32.ChecksumIEEE([]byte(src)) % 32
  11. return strconv.Itoa(int(sum))
  12. }
  13. // Crc16Hash 用于16张分表
  14. func Crc16Hash(src string) string {
  15. sum := crc32.ChecksumIEEE([]byte(src)) % 16
  16. return strconv.Itoa(int(sum))
  17. }
  18. // Crc8Hash 用于8张分表
  19. func Crc8Hash(src string) string {
  20. sum := crc32.ChecksumIEEE([]byte(src)) % 8
  21. return strconv.Itoa(int(sum))
  22. }
  23. // DynamicTable 动态表名
  24. // e.g. DB.Scopes(DynamicTable(Crc32Hash, "test", "小圈圈")).Find(&tests)
  25. // 设置动态表名scope params: f 分表计算函数 baseTable 基础表名 fieldValue 参与分表字段
  26. func DynamicTable(f func(string) string, baseTable, fieldValue string) func(db *gorm.DB) *gorm.DB {
  27. return func(db *gorm.DB) *gorm.DB {
  28. return db.Table(fmt.Sprintf("%s_%s", baseTable, f(fieldValue)))
  29. }
  30. }
  31. func CreateSubTable(f func(string) string) {
  32. }