diff options
Diffstat (limited to 'go/storage/needle.go')
| -rw-r--r-- | go/storage/needle.go | 29 |
1 files changed, 11 insertions, 18 deletions
diff --git a/go/storage/needle.go b/go/storage/needle.go index 66cf5b22a..e49368820 100644 --- a/go/storage/needle.go +++ b/go/storage/needle.go @@ -1,6 +1,7 @@ package storage import ( + "encoding/hex" "errors" "fmt" "io/ioutil" @@ -14,6 +15,7 @@ import ( "github.com/chrislusf/seaweedfs/go/glog" "github.com/chrislusf/seaweedfs/go/images" "github.com/chrislusf/seaweedfs/go/operation" + "github.com/chrislusf/seaweedfs/go/util" ) const ( @@ -211,25 +213,16 @@ func (n *Needle) ParsePath(fid string) (err error) { } func ParseKeyHash(key_hash_string string) (uint64, uint32, error) { - key, hash, ok := parseKeyHash(key_hash_string) - if !ok { + if len(key_hash_string)%2 == 1 { + key_hash_string = "0" + key_hash_string + } + key_hash_bytes, khe := hex.DecodeString(key_hash_string) + key_hash_len := len(key_hash_bytes) + if khe != nil || key_hash_len <= 4 { + glog.V(0).Infoln("Invalid key_hash", key_hash_string, "length:", key_hash_len, "error", khe) return 0, 0, errors.New("Invalid key and hash:" + key_hash_string) } + key := util.BytesToUint64(key_hash_bytes[0 : key_hash_len-4]) + hash := util.BytesToUint32(key_hash_bytes[key_hash_len-4 : key_hash_len]) return key, hash, nil } - -func parseKeyHash(keyhash string) (uint64, uint32, bool) { - if len(keyhash) <= 8 || len(keyhash) > 24 { - return 0, 0, false - } - split := len(keyhash) - 8 - key, err := strconv.ParseUint(keyhash[:split], 16, 64) - if err != nil { - return 0, 0, false - } - hash, err := strconv.ParseUint(keyhash[split:], 16, 32) - if err != nil { - return 0, 0, false - } - return key, uint32(hash), true -} |
