Use byte[] instead of IEnumerable<byte> if possible
[NovacoinLibrary.git] / Novacoin / Hash160.cs
1 \feff/**
2  *  Novacoin classes library
3  *  Copyright (C) 2015 Alex D. (balthazar.ad@gmail.com)
4
5  *  This program is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU Affero General Public License as
7  *  published by the Free Software Foundation, either version 3 of the
8  *  License, or (at your option) any later version.
9
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU Affero General Public License for more details.
14
15  *  You should have received a copy of the GNU Affero General Public License
16  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 using System.Linq;
20 using System.Collections.Generic;
21 using System.Security.Cryptography;
22
23 namespace Novacoin
24 {
25     /// <summary>
26     /// Representation of pubkey/script hash.
27     /// </summary>
28     public class Hash160 : Hash
29         {
30         /// <summary>
31         /// Computes RIPEMD160 hash using managed library
32         /// </summary>
33         private static readonly RIPEMD160Managed _hasher160 = new RIPEMD160Managed();
34         
35         // 20 bytes
36         public override int hashSize
37         {
38             get { return 20; }
39         }
40
41         public Hash160() : base() { }
42         public Hash160(byte[] bytes, int offset = 0) : base(bytes, offset) { }
43         public Hash160(IEnumerable<byte> bytes, int skip = 0) : base(bytes, skip) { }
44         public Hash160(Hash160 h) : base(h) { }
45
46         public static Hash160 Compute160(IEnumerable<byte> inputBytes)
47         {
48             var dataBytes = inputBytes.ToArray();
49             var digest1 = _hasher256.ComputeHash(dataBytes, 0, dataBytes.Length);
50             var digest2 = _hasher160.ComputeHash(digest1, 0, digest1.Length);
51
52             return new Hash160(digest2);
53         }
54         }
55 }
56