33
44namespace calg {
55
6-
7-
86 EXTERN_API int extern_test_getnum () { return 1 ; }
7+
98 inline bool cmp_a (i32 a, i32 b) { return a < b; }
9+
1010 inline bool cmp_b (i32 a, i32 b) { return a > b; }
11+
1112 inline i32 mix_2 (i32 a, i32 b) {
13+
1214 i32 ea1, ea2, ea3, eb1, eb2, eb3;
15+
1316 exp_1 (a, &ea1, &ea2, &ea3);
1417 exp_1 (b, &eb1, &eb2, &eb3);
18+
1519 i64 max, min, mid1, mid2;
20+
1621 calg::maxin (&max, &min, 6 , ea1, ea2, ea3, eb1, eb2, eb3);
22+
1723 mid1 = calg::mid (ea2, ea3, eb1);
1824 mid2 = calg::mid (ea3, eb1, eb2);
25+
1926 i32 m1 = (i32 )max, m2 = (i32 )min, m3 = (i32 )mid1, m4 = (i32 )mid2;
20- i32 ** arr = new i32 * [10 ]{
21- &ea1, &ea2, &ea3, &eb1, &eb2, &eb3, &m1, &m2, &m3, &m4
27+
28+ i32 ** arr = new i32 * [10 ] {
29+ &ea1, & ea2, & ea3, & eb1, & eb2, & eb3, & m1, & m2, & m3, & m4
2230 };
31+
2332 std::sort (arr, arr + 10 ,
2433 [](i32 * a, i32 * b) {
2534 return *a * *b % 2 == 0 ? *a > *b : *a < *b;
2635 }
2736 );
37+
2838 return (*arr[calg::abs ((i64 )(a * b)) % 9 ] + *arr[calg::abs ((i64 )(a * b - a)) % 9 ]
2939 + *arr[calg::abs ((i64 )(a * b - b)) % 9 ]
3040 + *arr[calg::abs ((i64 )(a * b - a - b)) % 9 ] + 1 + a ^ b + a & b) / 4 ;
3141 }
42+
3243 inline i32 mix_3 (i32 a, i32 b, i32 c) {
44+
3345 i64 t_max, t_min;
46+
3447 calg::maxin (&t_max, &t_min, 3 , a, b, c);
48+
3549 i32 max = (i32 )t_max, min = (i32 )t_min;
36- if (a == max) return ((i64 )(a * b * c) - min) % INT32_MAX;
37- else if (c - a > b) return (a * c + (b + c) * a) % INT32_MAX;
38- else if (c - a < b) return ((i64 )(b * c - b - c) + calg::pow (a, 2 ) % INT32_MAX);
50+
51+ if (a == max)
52+ return ((i64 )(a * b * c) - min) % INT32_MAX;
53+
54+ else if (c - a > b)
55+ return (a * c + (b + c) * a) % INT32_MAX;
56+
57+ else if (c - a < b)
58+ return ((i64 )(b * c - b - c) + calg::pow (a, 2 ) % INT32_MAX);
59+
3960 else return ((i64 )max * min + (max ^ min) * calg::mid (a, b, c)) % INT32_MAX;
4061 }
62+
4163 inline i32 mix_5 (i32 a, i32 b, i32 c, i32 d, i32 e) {
64+
4265 i32 A = mix_3 (a, b, c), B = mix_3 (c, d, e), C = mix_3 (b, c, d),
4366 D = mix_3 (a, c, e), E = mix_3 (a, b, d), F = mix_3 (e, d, b),
4467 G = mix_3 (a, d, e), H = mix_3 (e, b, a), I = mix_3 (b, c, e),
4568 J = mix_3 (d, c, a), K = mix_3 (a, b, e), L = mix_3 (e, d, a);
69+
4670 if (A ^ B & 1 ) {
71+
4772 i64 CDEF = (i64 )C * D - E - F;
73+
4874 return (i32 )calg::abs (CDEF % INT32_MAX - (i64 )K);
4975 }
5076 else {
77+
5178 i64 t_a = calg::abs ((i64 )(G + H) ^ (i64 )(I * J));
79+
5280 return t_a % INT32_MAX - (i64 )L;
5381 }
5482 }
83+
5584 inline void exp_1 (i32 x, i32 * a, i32 * b, i32 * c) {
85+
5686 i32 ea = (x << 1 ) & 114514 , eb = x ^ 1919 , ec = (x >> 1 ) & 810 ;
87+
5788 i32 ca = (i32 )gobit (x, 10 ), cb = (i32 )gobit (x >> 10 , 10 ), cc = (i32 )gobit (x >> 20 , 10 );
89+
5890 *a = (ea ^ ca) >> 1 , * b = (eb ^ cb) >> 1 , * c = (ec ^ cc) >> 1 ;
5991 }
92+
6093 inline void exp_1 (i32 x, i32 * a, i32 * b, i32 * c, i32 * d) {
61- i32 ea = (x << 1 ) & 114514 , eb = x ^ 1919 , ec = (x >> 1 ) & 810 , ed = x;
62- i32 ca = (i32 )gobit (x, 8 ), cb = (i32 )gobit (x >> 8 , 8 ), cc = (i32 )gobit (x >> 16 , 8 ), cd = (i32 )gobit (x >> 24 , 8 );
94+
95+ i32 ea = (x << 1 ) & 114514 , eb = x ^ 1919 ;
96+
97+ i32 ec = (x >> 1 ) & 810 , ed = x;
98+
99+ i32 ca = (i32 )gobit (x, 8 ), cb = (i32 )gobit (x >> 8 , 8 );
100+
101+ i32 cc = (i32 )gobit (x >> 16 , 8 ), cd = (i32 )gobit (x >> 24 , 8 );
102+
63103 *a = (ea ^ ca) >> 1 , * b = (eb ^ cb) >> 1 , * c = (ec ^ cc) >> 1 , * d = (ed ^ cd) >> 1 ;
64104 }
105+
65106 inline long double spring_func (long double x) {
107+
66108 ld A = sinl (calg::pi * log2l ((ld)calg::abs ((i64 )x * 2 + 1 )));
109+
67110 ld B = powl (2 , x * 2 ) + powl (calg::e, x * 4 );
111+
68112 return cosl (A + B);
69113 }
114+
70115 EXTERN_API void hash_str (uchar* src, uchar* rst, int length) {
116+
71117 i32 * mid = new i32 [hash_length]; // 中间运算结果
72118
73119 memset (mid, 0 , sizeof (i32 ) * hash_length); // 初始化中间运算结果数组
@@ -194,13 +240,18 @@ namespace calg {
194240
195241 return ;
196242 }
243+
197244 EXTERN_API void hash_compress_128_str (uchar* src, uchar* rst) {
245+
198246 i32 * mid = new i32 [128 ];
247+
199248 i32 ** at = new i32 * [16 ];
249+
200250 for (i32 i = 0 ; i < 16 ; ++i)
201251 at[i] = new i32 [128 ];
202252
203253 memset (mid, (i32 )src[64 ], sizeof (i32 ) * 128 );
254+
204255 for (i32 i = 0 , x = 0 , y = 0 ; i < 2048 ; ++i,
205256 x = y == 15 ? x + 1 : x,
206257 y = y == 15 ? 0 : y + 1 ) {
@@ -222,39 +273,62 @@ namespace calg {
222273 for (i32 i = 0 ; i < 16 ; ++i) {
223274 delete[] at[i]; at[i] = NULL ;
224275 }
276+
225277 delete[] at; at = NULL ;
226278 }
279+
227280 EXTERN_API void hash_compress_64_str (uchar* src, uchar* rst) {
281+
228282 uchar* mid = new uchar[128 ];
283+
229284 hash_compress_128_str (src, mid);
285+
230286 for (i32 i = 0 ; i < 64 ; ++i)
231287 rst[i] = (uchar)(calg::abs ((i64 )mix_2 ((i32 )mid[i * 2 ], (i32 )mid[i * 2 + 1 ])) % 255 );
232288 }
289+
233290 EXTERN_API void hash_compress_32_str (uchar* src, uchar* rst) {
291+
234292 uchar* mid = new uchar[64 ];
293+
235294 hash_compress_64_str (src, mid);
295+
236296 for (i32 i = 0 ; i < 32 ; ++i)
237297 rst[i] = (uchar)(calg::abs ((i64 )mix_2 ((i32 )mid[i * 2 ], (i32 )mid[i * 2 + 1 ])) % 255 );
238298 }
299+
239300 EXTERN_API void hash_compress_16_str (uchar* src, uchar* rst) {
301+
240302 uchar* mid = new uchar[32 ];
303+
241304 hash_compress_32_str (src, mid);
305+
242306 for (i32 i = 0 ; i < 16 ; ++i)
243307 rst[i] = (uchar)(calg::abs ((i64 )mix_2 ((i32 )mid[i * 2 ], (i32 )mid[i * 2 + 1 ])) % 255 );
244308 }
309+
245310 EXTERN_API void hash_compress_8_str (uchar* src, uchar* rst) {
311+
246312 uchar* mid = new uchar[16 ];
313+
247314 hash_compress_16_str (src, mid);
315+
248316 for (i32 i = 0 ; i < 8 ; ++i)
249317 rst[i] = (uchar)(calg::abs ((i64 )mix_2 ((i32 )mid[i * 2 ], (i32 )mid[i * 2 + 1 ])) % 255 );
250318 }
319+
251320 EXTERN_API void hash_compress_4_str (uchar* src, uchar* rst) {
321+
252322 uchar* mid = new uchar[8 ];
323+
253324 hash_compress_8_str (src, mid);
325+
254326 for (i32 i = 0 ; i < 4 ; ++i)
255327 rst[i] = (uchar)(calg::abs ((i64 )mix_2 ((i32 )mid[i * 2 ], (i32 )mid[i * 2 + 1 ])) % 255 );
256328 }
329+
257330 EXTERN_API int hash_file (uchar* fileName, int type) {
331+
258332 // TODO: 文件哈希
259333
260334 return 1 ;
0 commit comments