1111
1212using CatLib . API . Hashing ;
1313using CatLib . Hashing . Checksum ;
14- using CatLib . Hashing . HashString ;
15- using Murmur ;
1614using System ;
1715using System . Collections . Generic ;
1816using System . Security . Cryptography ;
@@ -25,6 +23,16 @@ namespace CatLib.Hashing
2523 /// </summary>
2624 internal sealed class Hashing : IHashing
2725 {
26+ /// <summary>
27+ /// 校验类字典
28+ /// </summary>
29+ private readonly Dictionary < Checksums , Func < IChecksum > > checksumsMaker ;
30+
31+ /// <summary>
32+ /// 非加密哈希字典
33+ /// </summary>
34+ private readonly Dictionary < Hashes , Func < HashAlgorithm > > hashByteMaker ;
35+
2836 /// <summary>
2937 /// 校验类字典
3038 /// </summary>
@@ -40,22 +48,65 @@ internal sealed class Hashing : IHashing
4048 /// </summary>
4149 private readonly object syncRoot = new object ( ) ;
4250
51+ /// <summary>
52+ /// 默认的校验算法
53+ /// </summary>
54+ private readonly Checksums defaultChecksum ;
55+
56+ /// <summary>
57+ /// 默认的哈希算法
58+ /// </summary>
59+ private readonly Hashes defaultHash ;
60+
4361 /// <summary>
4462 /// 哈希
4563 /// </summary>
46- public Hashing ( )
64+ public Hashing ( Checksums defaultChecksum , Hashes defaultHash )
4765 {
48- checksumsDict = new Dictionary < Checksums , IChecksum >
49- {
50- { Checksums . Crc32 , new Crc32 ( ) } ,
51- { Checksums . Adler32 , new Adler32 ( ) }
52- } ;
66+ Guard . Requires < ArgumentNullException > ( defaultChecksum != null ) ;
67+ Guard . Requires < ArgumentNullException > ( defaultHash != null ) ;
5368
54- hashByteDict = new Dictionary < Hashes , HashAlgorithm >
55- {
56- { Hashes . MurmurHash , new Murmur32ManagedX86 ( ) } ,
57- { Hashes . Djb , new DjbHash ( ) }
58- } ;
69+ this . defaultChecksum = defaultChecksum ;
70+ this . defaultHash = defaultHash ;
71+
72+ checksumsMaker = new Dictionary < Checksums , Func < IChecksum > > ( ) ;
73+ hashByteMaker = new Dictionary < Hashes , Func < HashAlgorithm > > ( ) ;
74+ checksumsDict = new Dictionary < Checksums , IChecksum > ( ) ;
75+ hashByteDict = new Dictionary < Hashes , HashAlgorithm > ( ) ;
76+ }
77+
78+ /// <summary>
79+ /// 注册校验算法
80+ /// </summary>
81+ /// <param name="checksum">校验类类型</param>
82+ /// <param name="builder">构建器</param>
83+ public void RegisterChecksum ( Checksums checksum , Func < IChecksum > builder )
84+ {
85+ Guard . Requires < ArgumentNullException > ( checksum != null ) ;
86+ Guard . Requires < ArgumentNullException > ( builder != null ) ;
87+ checksumsMaker . Add ( checksum , builder ) ;
88+ }
89+
90+ /// <summary>
91+ /// 注册校验算法
92+ /// </summary>
93+ /// <param name="hash">哈希类类型</param>
94+ /// <param name="builder">构建器</param>
95+ public void RegisterHash ( Hashes hash , Func < HashAlgorithm > builder )
96+ {
97+ Guard . Requires < ArgumentNullException > ( hash != null ) ;
98+ Guard . Requires < ArgumentNullException > ( builder != null ) ;
99+ hashByteMaker . Add ( hash , builder ) ;
100+ }
101+
102+ /// <summary>
103+ /// 使用默认的校验算法计算校验和
104+ /// </summary>
105+ /// <param name="buffer">字节数组</param>
106+ /// <returns>校验和</returns>
107+ public long Checksum ( byte [ ] buffer )
108+ {
109+ return Checksum ( buffer , defaultChecksum ) ;
59110 }
60111
61112 /// <summary>
@@ -64,13 +115,19 @@ public Hashing()
64115 /// <param name="buffer">字节数组</param>
65116 /// <param name="checksum">使用校验类类型</param>
66117 /// <returns>校验和</returns>
67- public long Checksum ( byte [ ] buffer , Checksums checksum = Checksums . Crc32 )
118+ public long Checksum ( byte [ ] buffer , Checksums checksum )
68119 {
69120 Guard . Requires < ArgumentNullException > ( buffer != null ) ;
70121 IChecksum checksumClass ;
71122 if ( ! checksumsDict . TryGetValue ( checksum , out checksumClass ) )
72123 {
73- throw new RuntimeException ( "Undefiend Checksum:" + checksum ) ;
124+ Func < IChecksum > checksumMaker ;
125+ if ( ! checksumsMaker . TryGetValue ( checksum , out checksumMaker )
126+ || ( checksumClass = checksumMaker . Invoke ( ) ) == null )
127+ {
128+ throw new RuntimeException ( "Undefiend Checksum:" + checksum ) ;
129+ }
130+ checksumsDict [ checksum ] = checksumClass ;
74131 }
75132 lock ( syncRoot )
76133 {
@@ -105,13 +162,23 @@ public bool CheckPassword(string input, string hash)
105162 return BCrypt . Net . BCrypt . Verify ( input , hash ) ;
106163 }
107164
165+ /// <summary>
166+ /// 对输入值进行非加密哈希
167+ /// </summary>
168+ /// <param name="input">输入值</param>
169+ /// <returns>哈希值</returns>
170+ public uint HashString ( string input )
171+ {
172+ return HashString ( input , defaultHash ) ;
173+ }
174+
108175 /// <summary>
109176 /// 对输入值进行非加密哈希
110177 /// </summary>
111178 /// <param name="input">输入值</param>
112179 /// <param name="hash">使用的哈希算法</param>
113180 /// <returns>哈希值</returns>
114- public uint HashString ( string input , Hashes hash = Hashes . MurmurHash )
181+ public uint HashString ( string input , Hashes hash )
115182 {
116183 return HashString ( input , Encoding . Default , hash ) ;
117184 }
@@ -123,28 +190,47 @@ public uint HashString(string input, Hashes hash = Hashes.MurmurHash)
123190 /// <param name="encoding">编码</param>
124191 /// <param name="hash">使用的哈希算法</param>
125192 /// <returns>哈希值</returns>
126- public uint HashString ( string input , Encoding encoding , Hashes hash = Hashes . MurmurHash )
193+ public uint HashString ( string input , Encoding encoding , Hashes hash )
127194 {
128195 Guard . Requires < ArgumentNullException > ( input != null ) ;
129196 Guard . Requires < ArgumentNullException > ( encoding != null ) ;
130197 var data = encoding . GetBytes ( input ) ;
131198 return HashByte ( data , hash ) ;
132199 }
133200
201+ /// <summary>
202+ /// 对输入值进行非加密哈希
203+ /// </summary>
204+ /// <param name="input">输入值</param>
205+ /// <returns>哈希值</returns>
206+ public uint HashByte ( byte [ ] input )
207+ {
208+ return HashByte ( input , defaultHash ) ;
209+ }
210+
134211 /// <summary>
135212 /// 对输入值进行非加密哈希
136213 /// </summary>
137214 /// <param name="input">输入值</param>
138215 /// <param name="hash">使用的哈希算法</param>
139216 /// <returns>哈希值</returns>
140- public uint HashByte ( byte [ ] input , Hashes hash = Hashes . MurmurHash )
217+ public uint HashByte ( byte [ ] input , Hashes hash )
141218 {
142219 Guard . Requires < ArgumentNullException > ( input != null ) ;
220+ Guard . Requires < ArgumentNullException > ( hash != null ) ;
221+
143222 HashAlgorithm hashStringClass ;
144223 if ( ! hashByteDict . TryGetValue ( hash , out hashStringClass ) )
145224 {
146- throw new RuntimeException ( "Undefiend Hashing:" + hash ) ;
225+ Func < HashAlgorithm > hashStringMaker ;
226+ if ( ! hashByteMaker . TryGetValue ( hash , out hashStringMaker )
227+ || ( hashStringClass = hashStringMaker . Invoke ( ) ) == null )
228+ {
229+ throw new RuntimeException ( "Undefiend Hashing:" + hash ) ;
230+ }
231+ hashByteDict [ hash ] = hashStringClass ;
147232 }
233+
148234 return BitConverter . ToUInt32 ( hashStringClass . ComputeHash ( input ) , 0 ) ;
149235 }
150236 }
0 commit comments