]> www.ginac.de Git - cln.git/blob - src/integer/hash/cl_I_hashcode.cc
4d78ed9f8e698a7597869308717d8c4ca9bc0aaf
[cln.git] / src / integer / hash / cl_I_hashcode.cc
1 // cl_I hashcode().
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cl_I.h"
8
9
10 // Implementation.
11
12 unsigned long hashcode (const cl_I& x)
13 {
14         var unsigned long code = 0x814BE3A5;
15         // We walk through all limbs. It may take some time for very large
16         // integers, but it's better than completely ignoring some limbs.
17         if (fixnump(x)) {
18                 #if (cl_value_len <= intLsize)
19                 code += FN_to_L(x);
20                 #elif (cl_word_size==64)
21                 code += FN_to_Q(x);
22                 code ^= (code >> 32);
23                 #endif
24                 code &= 0xFFFFFFFF;
25         } else {
26                 var const uintD* MSDptr;
27                 var uintC len;
28                 BN_to_NDS_nocopy(x, MSDptr=,len=,);
29                 for (; len > 0; len--) {
30                         var uintD c = msprefnext(MSDptr);
31                         code = (code << 5) | (code >> 27); // rotate left 5 bits
32                         code += (long)c << 16;
33                         code ^= (long)c;
34                         code &= 0xFFFFFFFF;
35                 }
36         }
37         return code;
38 }