| 103 | } |
| 104 | |
| 105 | func FromString(s string) (*Hash, error) { |
| 106 | for _, ha := range []HashAlgorithm{HashAlgorithmMD5, HashAlgorithmSHA1, HashAlgorithmSHA256} { |
| 107 | prefix := fmt.Sprintf("%s:", ha) |
| 108 | if strings.HasPrefix(s, prefix) { |
| 109 | return ha.FromString(s[len(prefix):]) |
| 110 | } |
| 111 | } |
| 112 | |
| 113 | var ha HashAlgorithm |
| 114 | switch len(s) { |
| 115 | case 32: |
| 116 | ha = HashAlgorithmMD5 |
| 117 | case 40: |
| 118 | ha = HashAlgorithmSHA1 |
| 119 | case 64: |
| 120 | ha = HashAlgorithmSHA256 |
| 121 | default: |
| 122 | return nil, fmt.Errorf("cannot determine algorithm for hash length: %d", len(s)) |
| 123 | } |
| 124 | |
| 125 | return ha.FromString(s) |
| 126 | } |
| 127 | |
| 128 | func (ha HashAlgorithm) Hash(r io.Reader) (*Hash, error) { |
| 129 | hasher := ha.NewHasher() |