1 // cl_I equal_hashcode().
7 #include "cln/integer.h"
17 static inline uint32 equal_hashcode (const cl_FN& x)
20 var uintV x_ = FN_to_V(x); // x als intVsize-Bit-Zahl
21 if (FN_V_minusp(x,(sintV)x_)) {
31 integerlength64(x_, s = 64 - );
32 var uint32 msd = (x_ << s) >> 32;
35 integerlength32(x_, s = 32 - );
36 var uint32 msd = x_ << s;
39 return equal_hashcode_low(msd,exp,sign);
42 static inline uint32 equal_hashcode (const cl_BN& x)
44 var const uintD* MSDptr;
46 BN_to_NDS_nocopy(x, MSDptr = , len = ,);
47 // Nicht alle führenden intDsize+1 Bits sind gleich.
49 var uint64 msd = mspref(MSDptr,0);
50 var uint64 msd2 = (len >= 2 ? mspref(MSDptr,1) : 0);
52 if ((sint64)msd < 0) { // falls <0, negieren
54 // msd|msd2 := - msd|msd2 - (1 falls noch weitere Bits /= 0)
55 msd = ~msd; msd2 = ~msd2;
57 || !test_loop_msp(MSDptr mspop 2, len - 2)
66 var sintC exp = len * intDsize;
67 // Nicht alle führenden 65 Bits sind =0.
73 integerlength64(msd, s = 64 - );
75 msd = (msd << s) | (msd2 >> (64-s));
78 return equal_hashcode_low((uint32)(msd>>32),exp,sign);
79 #else // (intDsize<=32)
82 if (len >= 64/intDsize) {
83 msd = get_32_Dptr(MSDptr);
84 msd2 = get_32_Dptr(MSDptr mspop 32/intDsize);
85 } elif (len > 32/intDsize) {
86 msd = get_32_Dptr(MSDptr);
87 msd2 = get_max32_Dptr(intDsize*len-32, MSDptr mspop 32/intDsize)
89 } elif ((32/intDsize == 1) || (len == 32/intDsize)) {
90 msd = get_32_Dptr(MSDptr);
92 } else { // (len > 0) && (len < 32/intDsize)
93 msd = get_max32_Dptr(intDsize*len,MSDptr) << (32-intDsize*len);
97 if ((sint32)msd < 0) { // falls <0, negieren
99 // msd|msd2 := - msd|msd2 - (1 falls noch weitere Bits /= 0)
100 msd = ~msd; msd2 = ~msd2;
101 if ((len <= 64/intDsize)
102 || !test_loop_msp(MSDptr mspop 64/intDsize, len - 64/intDsize)
111 var sintC exp = len * intDsize;
112 // Nicht alle führenden intDsize+1 Bits sind =0.
113 // Wegen intDsize<=32: Nicht alle führenden 33 Bits sind =0.
118 // Nicht alle führenden 32 Bits sind =0.
119 // Führendes Bit auf 1 normalisieren:
122 integerlength32(msd, s = 32 - );
124 msd = (msd << s) | (msd2 >> (32-s));
127 return equal_hashcode_low(msd,exp,sign);
131 CL_INLINE uint32 CL_INLINE_DECL(equal_hashcode) (const cl_I& x)
134 DeclareType(cl_FN,x);
135 return equal_hashcode(x);
137 DeclareType(cl_BN,x);
138 return equal_hashcode(x);