@@ -165,41 +165,41 @@ def get_decoder(cls, encoding):
165
165
Codecs .reset ()
166
166
167
167
168
- class Multihash (namedtuple ('Multihash' , 'func length digest' )):
169
- """A named tuple representing multihash function, length and digest.
168
+ class Multihash (namedtuple ('Multihash' , 'func digest' )):
169
+ """A named tuple representing a multihash function and digest.
170
170
171
171
The hash function is a `Func` member:
172
172
173
- >>> mh = Multihash(Func.sha1, 20, b'BINARY_DIGEST')
174
- >>> mh == (Func.sha1, 20, b'BINARY_DIGEST')
173
+ >>> mh = Multihash(Func.sha1, b'BINARY_DIGEST')
174
+ >>> mh == (Func.sha1, b'BINARY_DIGEST')
175
175
True
176
- >>> mh == (mh.func, mh.length, mh. digest)
176
+ >>> mh == (mh.func, mh.digest)
177
177
True
178
178
179
179
Although it can also be its integer value (the function code) or its
180
180
string name (the function name, with either underscore or hyphen):
181
181
182
- >>> mhfc = Multihash(Func.sha1.value, mh.length, mh. digest)
182
+ >>> mhfc = Multihash(Func.sha1.value, mh.digest)
183
183
>>> mhfc == mh
184
184
True
185
- >>> mhfn = Multihash('sha2-256', 32, b'...')
185
+ >>> mhfn = Multihash('sha2-256', b'...')
186
186
>>> mhfn.func is Func.sha2_256
187
187
True
188
188
189
189
Application-specific codes (0x00-0x0f) are also accepted. Other codes
190
190
raise a `ValueError`:
191
191
192
- >>> mhfc = Multihash(0x01, 4, b'...')
192
+ >>> mhfc = Multihash(0x01, b'...')
193
193
>>> mhfc.func
194
194
1
195
- >>> mhfc = Multihash(1234, 4, b'...')
195
+ >>> mhfc = Multihash(1234, b'...')
196
196
Traceback (most recent call last):
197
197
...
198
198
ValueError: ('invalid hash function code', 1234)
199
199
"""
200
200
__slots__ = ()
201
201
202
- def __new__ (cls , func , length , digest ):
202
+ def __new__ (cls , func , digest ):
203
203
try :
204
204
f = Func (func ) # function or function code
205
205
except ValueError as ve :
@@ -209,8 +209,7 @@ def __new__(cls, func, length, digest):
209
209
f = _func_from_name [func ] # function name
210
210
else :
211
211
raise ValueError ("invalid hash function code" , func )
212
- return super (cls , Multihash ).__new__ (
213
- cls , f , int (length ), bytes (digest ))
212
+ return super (cls , Multihash ).__new__ (cls , f , bytes (digest ))
214
213
215
214
@classmethod
216
215
def from_hash (self , hash ):
@@ -220,7 +219,7 @@ def from_hash(self, hash):
220
219
>>> hash = hashlib.sha1(b'foo')
221
220
>>> digest = hash.digest()
222
221
>>> mh = Multihash.from_hash(hash)
223
- >>> mh == (Func.sha1, len(digest), digest)
222
+ >>> mh == (Func.sha1, digest)
224
223
True
225
224
226
225
If there is no matching multihash hash function for the given `hash`,
@@ -237,14 +236,14 @@ def from_hash(self, hash):
237
236
except KeyError :
238
237
raise ValueError ("no matching multihash function" , hash .name )
239
238
digest = hash .digest ()
240
- return Multihash (func , len ( digest ), digest )
239
+ return Multihash (func , digest )
241
240
242
241
def encode (self , encoding = None ):
243
242
r"""Encode into a multihash-encoded digest.
244
243
245
244
If `encoding` is `None`, a binary digest is produced:
246
245
247
- >>> mh = Multihash(0x01, 4, b'TEST')
246
+ >>> mh = Multihash(0x01, b'TEST')
248
247
>>> mh.encode()
249
248
b'\x01\x04TEST'
250
249
@@ -258,7 +257,7 @@ def encode(self, encoding=None):
258
257
fc = self .func .value
259
258
except AttributeError : # application-specific function code
260
259
fc = self .func
261
- mhash = bytes ([fc , self .length ]) + self .digest
260
+ mhash = bytes ([fc , len ( self .digest ) ]) + self .digest
262
261
if encoding :
263
262
mhash = Codecs .get_encoder (encoding )(mhash )
264
263
return mhash
@@ -278,7 +277,7 @@ def verify(self, data):
278
277
Application-specific hash functions are currently not supported and a
279
278
`ValueError` is raised:
280
279
281
- >>> mh = Multihash(0x01, 4, b'TEST')
280
+ >>> mh = Multihash(0x01, b'TEST')
282
281
>>> mh.verify(data)
283
282
Traceback (most recent call last):
284
283
...
@@ -292,27 +291,27 @@ def verify(self, data):
292
291
raise ValueError ("no available hash function for hash" , self .func )
293
292
hash .update (data )
294
293
digest = bytes (hash .digest ())
295
- return digest [:self .length ] == self .digest
294
+ return digest [:len ( self .digest ) ] == self .digest
296
295
297
296
def truncate (self , length ):
298
297
"""Return a new `Multihash` with a shorter digest `length`.
299
298
300
299
If the given `length` is greater than the original, a `ValueError`
301
300
is raised.
302
301
303
- >>> mh1 = Multihash(0x01, 6, b'FOOBAR')
302
+ >>> mh1 = Multihash(0x01, b'FOOBAR')
304
303
>>> mh2 = mh1.truncate(3)
305
- >>> mh2 == (0x01, 3, b'FOO')
304
+ >>> mh2 == (0x01, b'FOO')
306
305
True
307
306
>>> mh3 = mh1.truncate(10)
308
307
Traceback (most recent call last):
309
308
...
310
309
ValueError: cannot enlarge the original digest by 4 bytes
311
310
"""
312
- if length > self .length :
311
+ if length > len ( self .digest ) :
313
312
raise ValueError ("cannot enlarge the original digest by %d bytes"
314
- % (length - self .length ))
315
- return self .__class__ (self .func , length , self .digest [:length ])
313
+ % (length - len ( self .digest ) ))
314
+ return self .__class__ (self .func , self .digest [:length ])
316
315
317
316
318
317
def decode (mhash , encoding = None ):
@@ -322,7 +321,7 @@ def decode(mhash, encoding=None):
322
321
323
322
>>> mhash = b'\x11\x0a\x0b\xee\xc7\xb5\xea?\x0f\xdb\xc9]'
324
323
>>> mh = decode(mhash)
325
- >>> mh == (Func.sha1, 10, mhash[2:])
324
+ >>> mh == (Func.sha1, mhash[2:])
326
325
True
327
326
328
327
If an `encoding` is specified, it is used to decode the digest
@@ -336,7 +335,8 @@ def decode(mhash, encoding=None):
336
335
"""
337
336
if encoding :
338
337
mhash = Codecs .get_decoder (encoding )(mhash )
339
- return Multihash (int (mhash [0 ]), int (mhash [1 ]), mhash [2 :])
338
+ # TODO: check lenghts
339
+ return Multihash (int (mhash [0 ]), mhash [2 :])
340
340
341
341
342
342
def _test ():
0 commit comments