11#include " Hash.h"
22
33
4- namespace calg {
4+ namespace calg {
55
66
77
8- EXTERN_API int extern_test_getnum (){ return 1 ; }
9- inline bool cmp_a (i32 a, i32 b){ return a < b; }
10- inline bool cmp_b (i32 a, i32 b){ return a > b; }
11- inline i32 mix_2 (i32 a, i32 b){
8+ EXTERN_API int extern_test_getnum () { return 1 ; }
9+ inline bool cmp_a (i32 a, i32 b) { return a < b; }
10+ inline bool cmp_b (i32 a, i32 b) { return a > b; }
11+ inline i32 mix_2 (i32 a, i32 b) {
1212 i32 ea1, ea2, ea3, eb1, eb2, eb3;
1313 exp_1 (a, &ea1, &ea2, &ea3);
1414 exp_1 (b, &eb1, &eb2, &eb3);
@@ -17,19 +17,19 @@ namespace calg{
1717 mid1 = calg::mid (ea2, ea3, eb1);
1818 mid2 = calg::mid (ea3, eb1, eb2);
1919 i32 m1 = (i32 )max, m2 = (i32 )min, m3 = (i32 )mid1, m4 = (i32 )mid2;
20- i32 ** arr = new i32 * [10 ]{
20+ i32 ** arr = new i32 * [10 ]{
2121 &ea1, &ea2, &ea3, &eb1, &eb2, &eb3, &m1, &m2, &m3, &m4
2222 };
2323 std::sort (arr, arr + 10 ,
24- [](i32 * a, i32 *b) {
25- return *a * *b % 2 == 0 ? *a > *b : *a < *b;
26- }
24+ [](i32 * a, i32 * b) {
25+ return *a * *b % 2 == 0 ? *a > *b : *a < *b;
26+ }
2727 );
2828 return (*arr[calg::abs ((i64 )(a * b)) % 9 ] + *arr[calg::abs ((i64 )(a * b - a)) % 9 ]
29- + *arr[calg::abs ((i64 )(a * b - b)) % 9 ]
30- + *arr[calg::abs ((i64 )(a * b - a - b)) % 9 ] + 1 + a ^ b + a & b) / 4 ;
29+ + *arr[calg::abs ((i64 )(a * b - b)) % 9 ]
30+ + *arr[calg::abs ((i64 )(a * b - a - b)) % 9 ] + 1 + a ^ b + a & b) / 4 ;
3131 }
32- inline i32 mix_3 (i32 a, i32 b, i32 c){
32+ inline i32 mix_3 (i32 a, i32 b, i32 c) {
3333 i64 t_max, t_min;
3434 calg::maxin (&t_max, &t_min, 3 , a, b, c);
3535 i32 max = (i32 )t_max, min = (i32 )t_min;
@@ -38,36 +38,37 @@ namespace calg{
3838 else if (c - a < b) return ((i64 )(b * c - b - c) + calg::pow (a, 2 ) % INT32_MAX );
3939 else return ((i64 )max * min + (max ^ min) * calg::mid (a, b, c)) % INT32_MAX ;
4040 }
41- inline i32 mix_5 (i32 a, i32 b, i32 c, i32 d, i32 e){
41+ inline i32 mix_5 (i32 a, i32 b, i32 c, i32 d, i32 e) {
4242 i32 A = mix_3 (a, b, c), B = mix_3 (c, d, e), C = mix_3 (b, c, d),
4343 D = mix_3 (a, c, e), E = mix_3 (a, b, d), F = mix_3 (e, d, b),
4444 G = mix_3 (a, d, e), H = mix_3 (e, b, a), I = mix_3 (b, c, e),
4545 J = mix_3 (d, c, a), K = mix_3 (a, b, e), L = mix_3 (e, d, a);
46- if (A ^ B & 1 ){
46+ if (A ^ B & 1 ) {
4747 i64 CDEF = (i64 )C * D - E - F;
4848 return (i32 )calg::abs (CDEF % INT32_MAX - (i64 )K);
49- } else {
49+ }
50+ else {
5051 i64 t_a = calg::abs ((i64 )(G + H) ^ (i64 )(I * J));
5152 return t_a % INT32_MAX - (i64 )L;
5253 }
5354 }
54- inline void exp_1 (i32 x, i32 * a, i32 * b, i32 *c) {
55+ inline void exp_1 (i32 x, i32 * a, i32 * b, i32 * c) {
5556 i32 ea = (x << 1 ) & 114514 , eb = x ^ 1919 , ec = (x >> 1 ) & 810 ;
5657 i32 ca = (i32 )gobit (x, 10 ), cb = (i32 )gobit (x >> 10 , 10 ), cc = (i32 )gobit (x >> 20 , 10 );
57- *a = (ea ^ ca) >> 1 , *b = (eb ^ cb) >> 1 , *c = (ec ^ cc) >> 1 ;
58+ *a = (ea ^ ca) >> 1 , * b = (eb ^ cb) >> 1 , * c = (ec ^ cc) >> 1 ;
5859 }
59- inline void exp_1 (i32 x, i32 * a, i32 * b, i32 * c, i32 *d) {
60+ inline void exp_1 (i32 x, i32 * a, i32 * b, i32 * c, i32 * d) {
6061 i32 ea = (x << 1 ) & 114514 , eb = x ^ 1919 , ec = (x >> 1 ) & 810 , ed = x;
6162 i32 ca = (i32 )gobit (x, 8 ), cb = (i32 )gobit (x >> 8 , 8 ), cc = (i32 )gobit (x >> 16 , 8 ), cd = (i32 )gobit (x >> 24 , 8 );
62- *a = (ea ^ ca) >> 1 , *b = (eb ^ cb) >> 1 , *c = (ec ^ cc) >> 1 , *d = (ed ^ cd) >> 1 ;
63+ *a = (ea ^ ca) >> 1 , * b = (eb ^ cb) >> 1 , * c = (ec ^ cc) >> 1 , * d = (ed ^ cd) >> 1 ;
6364 }
64- inline long double spring_func (long double x){
65+ inline long double spring_func (long double x) {
6566 ld A = sinl (calg::pi * log2l ((ld)calg::abs ((i64 )x * 2 + 1 )));
6667 ld B = powl (2 , x * 2 ) + powl (calg::e, x * 4 );
6768 return cosl (A + B);
6869 }
69- EXTERN_API void hash_str (uchar * src, uchar * rst, int length){
70- i32 * mid = new i32 [hash_length]; // 中间运算结果
70+ EXTERN_API void hash_str (uchar* src, uchar* rst, int length) {
71+ i32 * mid = new i32 [hash_length]; // 中间运算结果
7172
7273 memset (mid, 0 , sizeof (i32 ) * hash_length); // 初始化中间运算结果数组
7374 memset (mid, ' 0' , sizeof (uchar) * hash_length); // 初始化结果数组
@@ -76,32 +77,33 @@ namespace calg{
7677 if (length == hash_length) // 长度刚好, 直接填充
7778 for (i32 i = 0 ; i < hash_length; ++i)
7879 mid[i] = (i32 )src[i];
79- else if (length > hash_length){ // 源较长, n 元混合
80+ else if (length > hash_length) { // 源较长, n 元混合
8081 mid[0 ] = mix_5 (src[0 ], src[1 ], src[2 ], src[3 ], src[4 ]);
8182 mid[1 ] = mix_3 (mid[0 ], src[1 ], src[2 ]);
8283 mid[2 ] = mix_5 (mid[0 ], mid[1 ], src[2 ], src[3 ], src[4 ]);
8384 for (i32 i = 3 , pos = 3 ; i < length;
84- ++i, pos = pos == hash_length ? 3 : pos + 1 ){
85+ ++i, pos = pos == hash_length ? 3 : pos + 1 ) {
8586 mid[pos % hash_length] = mix_3 (src[i], mid[pos - 1 ], mid[pos - 2 ]);
8687 }
87- } else { // 源较短, n 元扩展
88+ }
89+ else { // 源较短, n 元扩展
8890 for (i32 i = 0 , t = 0 ; i < hash_length; // 初始化赋值
89- ++ i, t = t == 0x7fffffff ? 0 : t + 1 ){
91+ ++ i, t = t == 0x7fffffff ? 0 : t + 1 ) {
9092 mid[i] += t ^ mid[i % length];
9193 }
9294 i32 α = 0 , β = α + mid[0 ], γ = α ^ β; // 系数
9395 std::queue<i32 > tar; // 已扩展的存储队列
94- for (i32 i = 0 , a, b, c; i < length; ++ i) {
96+ for (i32 i = 0 , a, b, c; i < length; ++i) {
9597 exp_1 (src[i], &a, &b, &c);
9698 tar.push (a); tar.push (b); tar.push (c);
97- if (mix_3 (a, b, c) % 2 == 0 ) ++ α;
98- else -- α;
99+ if (mix_3 (a, b, c) % 2 == 0 ) ++α;
100+ else --α;
99101 if (mix_5 (a, b, c, α, β) & 1 ) β += α;
100102 else β /= α ^ b;
101103 if (mix_3 (α, β, γ) % 2 == 0 ) γ += α * β;
102104 else γ -= β - α;
103105 }
104- while (tar.size () < hash_length){ // 数量不足 2048 时
106+ while (tar.size () < hash_length) { // 数量不足 2048 时
105107 i32 x, y; x = tar.front (); tar.pop (); // 取出两个进行分解并追加
106108 y = tar.front (); tar.pop ();
107109 i32 xa, xb, xc, ya, yb, yc; // 分解值变量
@@ -113,37 +115,37 @@ namespace calg{
113115 tar.push (mix_3 (ya, yb, xb));
114116 tar.push (mix_3 (ya, yb, xc));
115117 }
116- for (i32 i = 0 ; i < hash_length; ++ i) {
118+ for (i32 i = 0 ; i < hash_length; ++i) {
117119 mid[i] = (i32 )calg::abs ((i64 )(tar.front () ^ tar.back () * α));
118120 tar.push (tar.front ()); tar.pop ();
119121 mid[i] *= tar.back () + (α - (β ^ γ));
120122 }
121123 }
122124
123- for (i32 i = 2 ; i < hash_length - 3 ; ++ i) {
124- i32 * α = new i32 [5 ]{
125+ for (i32 i = 2 ; i < hash_length - 3 ; ++i) {
126+ i32 * α = new i32 [5 ]{
125127 mid[i - 2 ], mid[i - 1 ], mid[i], mid[i + 1 ], mid[i + 2 ]
126- }, *σ = new i32 [3 ]{
128+ }, * σ = new i32 [3 ]{
127129 mid[i - 2 ] ^ mid[i - 1 ], mid[i], mid[i + 1 ] ^ mid[i + 2 ]
128130 };
129131 i64 sum = 0 , mul = 1 , γ = 114514 ;
130132 if (mid[i] % 2 == 0 ) std::sort (α, α + 5 , cmp_a);
131133 else std::sort (σ, σ + 3 , cmp_b);
132- for (i32 j = 0 ; j < 5 ; ++ j)
133- for (i32 k = 0 ; k < 3 ; ++ k) {
134+ for (i32 j = 0 ; j < 5 ; ++j)
135+ for (i32 k = 0 ; k < 3 ; ++k) {
134136 i64 num = α[j] ^ σ[k];
135137 if (!num) num += (i64 )(j * k);
136138 sum += num, mul *= num, γ ^= (sum * mul);
137139 α[j] *= (i32 )sum, σ[k] *= (i32 )mul;
138140 if (!α[j]) α[j] += j * j * k;
139141 if (!σ[k]) σ[k] += j * k * k;
140142 }
141- for (i32 j = i - 2 , k = 0 ; j < i + 2 ; ++ j, ++ k)
143+ for (i32 j = i - 2 , k = 0 ; j < i + 2 ; ++j, ++k)
142144 mid[j] += (α[k] & σ[k % 3 ]) ? α[k] & σ[k % 3 ] : α[k] * σ[k % 3 ];
143145 delete[] α, σ;
144146 }
145147
146- for (i32 i = 2 ; i <= hash_length - 3 ; ++ i) {
148+ for (i32 i = 2 ; i <= hash_length - 3 ; ++i) {
147149 i32 a = mid[i - 1 ], b = mid[i], c = mid[i + 1 ], tmp;
148150 tmp = a, a = c, c = tmp;
149151 b = calg::max (3 , a * c, a * b, b * c) % 255 ;
@@ -166,8 +168,8 @@ namespace calg{
166168 }
167169
168170 for (i32 i = 0 , j = hash_length - 1 , launched = 1 ;
169- i != j && i < j && i != j - 1 ;
170- ++ i, ++ launched, j -= ((~mid[i + 1 ] ^ mid[i]) % 3 == 0 ? 1 : 2 )){
171+ i != j && i < j && i != j - 1 ;
172+ ++ i, ++launched, j -= ((~mid[i + 1 ] ^ mid[i]) % 3 == 0 ? 1 : 2 )) {
171173 mid[i] += mid[j] * mid[j - 1 ];
172174 mid[i] >>= (mid[i + 1 ] % 4 );
173175 mid[i + 1 ] = mid[i] & (mid[j - 1 ] + mid[j]);
@@ -185,29 +187,29 @@ namespace calg{
185187 if (launched >= 2048 ) break ;
186188 }
187189
188- for (i32 i = 0 ; i < hash_length; ++ i) // 拷贝中间运算结果到结果
190+ for (i32 i = 0 ; i < hash_length; ++i) // 拷贝中间运算结果到结果
189191 rst[i] = (uchar)((i32 )calg::abs ((i64 )mid[i]) % 255 );
190192
191193 delete[] mid; mid = NULL ; // 回收中间运算结果数组
192194
193195 return ;
194196 }
195- EXTERN_API void hash_compress_128_str (uchar * src, uchar * rst){
196- i32 * mid = new i32 [128 ];
197- i32 ** at = new i32 * [16 ];
198- for (i32 i = 0 ; i < 16 ; ++ i)
197+ EXTERN_API void hash_compress_128_str (uchar* src, uchar* rst) {
198+ i32 * mid = new i32 [128 ];
199+ i32 ** at = new i32 * [16 ];
200+ for (i32 i = 0 ; i < 16 ; ++i)
199201 at[i] = new i32 [128 ];
200202
201203 memset (mid, (i32 )src[64 ], sizeof (i32 ) * 128 );
202- for (i32 i = 0 , x = 0 , y = 0 ; i < 2048 ; ++ i,
203- x = y == 15 ? x + 1 : x,
204- y = y == 15 ? 0 : y + 1 ){
204+ for (i32 i = 0 , x = 0 , y = 0 ; i < 2048 ; ++i,
205+ x = y == 15 ? x + 1 : x,
206+ y = y == 15 ? 0 : y + 1 ) {
205207 at[y][x] = (i32 )src[i];
206208 }
207209
208- for (i32 i = 0 ; i < 128 ; ++ i) {
210+ for (i32 i = 0 ; i < 128 ; ++i) {
209211 i64 tmp = 1 ;
210- for (i32 j = 0 ; j < 16 ; ++ j) {
212+ for (i32 j = 0 ; j < 16 ; ++j) {
211213 tmp *= (i64 )(at[j][i] == 0 ? i * j : at[j][i] + i * j);
212214 if (i != 0 && j != 0 )
213215 tmp += (i64 )at[j - 1 ][i - 1 ];
@@ -217,42 +219,42 @@ namespace calg{
217219 rst[i] = (uchar)((i32 )calg::abs (tmp) % 255 );
218220 }
219221
220- for (i32 i = 0 ; i < 16 ; ++ i) {
222+ for (i32 i = 0 ; i < 16 ; ++i) {
221223 delete[] at[i]; at[i] = NULL ;
222224 }
223225 delete[] at; at = NULL ;
224226 }
225- EXTERN_API void hash_compress_64_str (uchar * src, uchar * rst){
226- uchar * mid = new uchar[128 ];
227+ EXTERN_API void hash_compress_64_str (uchar* src, uchar* rst) {
228+ uchar* mid = new uchar[128 ];
227229 hash_compress_128_str (src, mid);
228- for (i32 i = 0 ; i < 64 ; ++ i)
230+ for (i32 i = 0 ; i < 64 ; ++i)
229231 rst[i] = (uchar)(calg::abs ((i64 )mix_2 ((i32 )mid[i * 2 ], (i32 )mid[i * 2 + 1 ])) % 255 );
230232 }
231- EXTERN_API void hash_compress_32_str (uchar * src, uchar * rst){
232- uchar * mid = new uchar[64 ];
233+ EXTERN_API void hash_compress_32_str (uchar* src, uchar* rst) {
234+ uchar* mid = new uchar[64 ];
233235 hash_compress_64_str (src, mid);
234- for (i32 i = 0 ; i < 32 ; ++ i)
236+ for (i32 i = 0 ; i < 32 ; ++i)
235237 rst[i] = (uchar)(calg::abs ((i64 )mix_2 ((i32 )mid[i * 2 ], (i32 )mid[i * 2 + 1 ])) % 255 );
236238 }
237- EXTERN_API void hash_compress_16_str (uchar * src, uchar * rst){
238- uchar * mid = new uchar[32 ];
239+ EXTERN_API void hash_compress_16_str (uchar* src, uchar* rst) {
240+ uchar* mid = new uchar[32 ];
239241 hash_compress_32_str (src, mid);
240- for (i32 i = 0 ; i < 16 ; ++ i)
242+ for (i32 i = 0 ; i < 16 ; ++i)
241243 rst[i] = (uchar)(calg::abs ((i64 )mix_2 ((i32 )mid[i * 2 ], (i32 )mid[i * 2 + 1 ])) % 255 );
242244 }
243- EXTERN_API void hash_compress_8_str (uchar * src, uchar * rst){
244- uchar * mid = new uchar[16 ];
245+ EXTERN_API void hash_compress_8_str (uchar* src, uchar* rst) {
246+ uchar* mid = new uchar[16 ];
245247 hash_compress_16_str (src, mid);
246- for (i32 i = 0 ; i < 8 ; ++ i)
248+ for (i32 i = 0 ; i < 8 ; ++i)
247249 rst[i] = (uchar)(calg::abs ((i64 )mix_2 ((i32 )mid[i * 2 ], (i32 )mid[i * 2 + 1 ])) % 255 );
248250 }
249- EXTERN_API void hash_compress_4_str (uchar * src, uchar * rst){
250- uchar * mid = new uchar[8 ];
251+ EXTERN_API void hash_compress_4_str (uchar* src, uchar* rst) {
252+ uchar* mid = new uchar[8 ];
251253 hash_compress_8_str (src, mid);
252- for (i32 i = 0 ; i < 4 ; ++ i)
254+ for (i32 i = 0 ; i < 4 ; ++i)
253255 rst[i] = (uchar)(calg::abs ((i64 )mix_2 ((i32 )mid[i * 2 ], (i32 )mid[i * 2 + 1 ])) % 255 );
254256 }
255- EXTERN_API int hash_file (uchar * fileName, int type){
257+ EXTERN_API int hash_file (uchar* fileName, int type) {
256258 // TODO: 文件哈希
257259
258260 return 1 ;
0 commit comments