You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

rs.go 1.2 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package ec
  2. import (
  3. "github.com/klauspost/reedsolomon"
  4. )
  5. type Rs struct {
  6. encoder reedsolomon.Encoder
  7. ecN int
  8. ecK int
  9. ecP int
  10. }
  11. func NewRs(k int, n int) (*Rs, error) {
  12. enc := Rs{
  13. ecN: n,
  14. ecK: k,
  15. ecP: n - k,
  16. }
  17. encoder, err := reedsolomon.New(k, n-k)
  18. enc.encoder = encoder
  19. return &enc, err
  20. }
  21. // 任意k个块恢复出所有原始的数据块。
  22. // blocks的长度必须为N,且至少有K个元素不为nil
  23. func (r *Rs) ReconstructData(blocks [][]byte) error {
  24. outIndexes := make([]int, r.ecK)
  25. for i := 0; i < r.ecK; i++ {
  26. outIndexes[i] = i
  27. }
  28. return r.ReconstructAny(blocks, outIndexes)
  29. }
  30. // 重建指定的任意块,可以是数据块或校验块。
  31. // 在input上原地重建,因此input的长度必须为N。
  32. func (r *Rs) ReconstructAny(blocks [][]byte, outBlockIdxes []int) error {
  33. required := make([]bool, len(blocks))
  34. for _, idx := range outBlockIdxes {
  35. required[idx] = true
  36. }
  37. return r.encoder.ReconstructAny(blocks, required)
  38. }
  39. func (r *Rs) GenerateMatrix(inputIdxs []int, outputIdxs []int) ([][]byte, error) {
  40. return r.encoder.(reedsolomon.Extensions).GenerateMatrix(inputIdxs, outputIdxs)
  41. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。