| Index: lib/src/hash_sink.dart | 
| diff --git a/lib/src/hash_base.dart b/lib/src/hash_sink.dart | 
| similarity index 91% | 
| rename from lib/src/hash_base.dart | 
| rename to lib/src/hash_sink.dart | 
| index 8cd2ad5e502155288488f58164d6c1d8412715b5..c5986e528b86db170af53c33593cc5eb0dc213ab 100644 | 
| --- a/lib/src/hash_base.dart | 
| +++ b/lib/src/hash_sink.dart | 
| @@ -8,13 +8,17 @@ import 'dart:typed_data'; | 
|  | 
| import 'package:typed_data/typed_data.dart'; | 
|  | 
| +import 'digest.dart'; | 
| import 'hash.dart'; | 
| import 'utils.dart'; | 
|  | 
| -/// A base class for [Hash] implementations. | 
| +/// A base class for [Sink] implementations for hash algorithms. | 
| /// | 
| /// Subclasses should override [updateHash] and [digest]. | 
| -abstract class HashBase implements Hash { | 
| +abstract class HashSink implements Sink<List<int>> { | 
| +  /// The inner sink that this should forward to. | 
| +  final Sink<Digest> _sink; | 
| + | 
| /// Whether the hash function operates on big-endian words. | 
| final Endianness _endian; | 
|  | 
| @@ -38,13 +42,12 @@ abstract class HashBase implements Hash { | 
| /// This should be updated each time [updateHash] is called. | 
| Uint32List get digest; | 
|  | 
| -  int get blockSize => _currentChunk.lengthInBytes; | 
| - | 
| /// Creates a new hash. | 
| /// | 
| /// [chunkSizeInWords] represents the size of the input chunks processed by | 
| /// the algorithm, in terms of 32-bit words. | 
| -  HashBase(int chunkSizeInWords, {Endianness endian: Endianness.BIG_ENDIAN}) | 
| +  HashSink(this._sink, int chunkSizeInWords, | 
| +          {Endianness endian: Endianness.BIG_ENDIAN}) | 
| : _endian = endian, | 
| _currentChunk = new Uint32List(chunkSizeInWords); | 
|  | 
| @@ -62,14 +65,14 @@ abstract class HashBase implements Hash { | 
| _iterate(); | 
| } | 
|  | 
| -  List<int> close() { | 
| -    if (_isClosed) return _byteDigest(); | 
| +  void close() { | 
| +    if (_isClosed) return; | 
| _isClosed = true; | 
|  | 
| _finalizeData(); | 
| _iterate(); | 
| assert(_pendingData.isEmpty); | 
| -    return _byteDigest(); | 
| +    _sink.add(new Digest(_byteDigest())); | 
| } | 
|  | 
| Uint8List _byteDigest() { | 
|  |