annotate Include/pyhash.h @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents adb471b9cba1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
87288
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1 #ifndef Py_HASH_H
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
3 #define Py_HASH_H
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
4 #ifdef __cplusplus
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
5 extern "C" {
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
6 #endif
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
7
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
8 /* Helpers for hash functions */
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
9 #ifndef Py_LIMITED_API
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
10 PyAPI_FUNC(Py_hash_t) _Py_HashDouble(double);
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
11 PyAPI_FUNC(Py_hash_t) _Py_HashPointer(void*);
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
12 PyAPI_FUNC(Py_hash_t) _Py_HashBytes(const void*, Py_ssize_t);
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
13 #endif
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
14
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
15 /* Prime multiplier used in string and various other hashes. */
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
16 #define _PyHASH_MULTIPLIER 1000003UL /* 0xf4243 */
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
17
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
18 /* Parameters used for the numeric hash implementation. See notes for
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
19 _Py_HashDouble in Objects/object.c. Numeric hashes are based on
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
20 reduction modulo the prime 2**_PyHASH_BITS - 1. */
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
21
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
22 #if SIZEOF_VOID_P >= 8
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
23 # define _PyHASH_BITS 61
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
24 #else
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
25 # define _PyHASH_BITS 31
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
26 #endif
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
27
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
28 #define _PyHASH_MODULUS (((size_t)1 << _PyHASH_BITS) - 1)
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
29 #define _PyHASH_INF 314159
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
30 #define _PyHASH_NAN 0
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
31 #define _PyHASH_IMAG _PyHASH_MULTIPLIER
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
32
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
33
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
34 /* hash secret
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
35 *
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
36 * memory layout on 64 bit systems
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
37 * cccccccc cccccccc cccccccc uc -- unsigned char[24]
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
38 * pppppppp ssssssss ........ fnv -- two Py_hash_t
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
39 * k0k0k0k0 k1k1k1k1 ........ siphash -- two PY_UINT64_T
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
40 * ........ ........ ssssssss djbx33a -- 16 bytes padding + one Py_hash_t
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
41 * ........ ........ eeeeeeee pyexpat XML hash salt
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
42 *
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
43 * memory layout on 32 bit systems
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
44 * cccccccc cccccccc cccccccc uc
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
45 * ppppssss ........ ........ fnv -- two Py_hash_t
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
46 * k0k0k0k0 k1k1k1k1 ........ siphash -- two PY_UINT64_T (*)
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
47 * ........ ........ ssss.... djbx33a -- 16 bytes padding + one Py_hash_t
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
48 * ........ ........ eeee.... pyexpat XML hash salt
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
49 *
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
50 * (*) The siphash member may not be available on 32 bit platforms without
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
51 * an unsigned int64 data type.
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
52 */
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
53 typedef union {
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
54 /* ensure 24 bytes */
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
55 unsigned char uc[24];
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
56 /* two Py_hash_t for FNV */
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
57 struct {
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
58 Py_hash_t prefix;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
59 Py_hash_t suffix;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
60 } fnv;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
61 #ifdef PY_UINT64_T
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
62 /* two uint64 for SipHash24 */
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
63 struct {
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
64 PY_UINT64_T k0;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
65 PY_UINT64_T k1;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
66 } siphash;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
67 #endif
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
68 /* a different (!) Py_hash_t for small string optimization */
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
69 struct {
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
70 unsigned char padding[16];
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
71 Py_hash_t suffix;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
72 } djbx33a;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
73 struct {
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
74 unsigned char padding[16];
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
75 Py_hash_t hashsalt;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
76 } expat;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
77 } _Py_HashSecret_t;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
78 PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
79
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
80 #ifdef Py_DEBUG
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
81 PyAPI_DATA(int) _Py_HashSecret_Initialized;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
82 #endif
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
83
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
84
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
85 /* hash function definition */
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
86 #ifndef Py_LIMITED_API
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
87 typedef struct {
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
88 Py_hash_t (*const hash)(const void *, Py_ssize_t);
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
89 const char *name;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
90 const int hash_bits;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
91 const int seed_bits;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
92 } PyHash_FuncDef;
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
93
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
94 PyAPI_FUNC(PyHash_FuncDef*) PyHash_GetFuncDef(void);
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
95 #endif
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
96
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
97
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
98 /* cutoff for small string DJBX33A optimization in range [1, cutoff).
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
99 *
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
100 * About 50% of the strings in a typical Python application are smaller than
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
101 * 6 to 7 chars. However DJBX33A is vulnerable to hash collision attacks.
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
102 * NEVER use DJBX33A for long strings!
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
103 *
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
104 * A Py_HASH_CUTOFF of 0 disables small string optimization. 32 bit platforms
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
105 * should use a smaller cutoff because it is easier to create colliding
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
106 * strings. A cutoff of 7 on 64bit platforms and 5 on 32bit platforms should
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
107 * provide a decent safety margin.
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
108 */
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
109 #ifndef Py_HASH_CUTOFF
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
110 # define Py_HASH_CUTOFF 0
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
111 #elif (Py_HASH_CUTOFF > 7 || Py_HASH_CUTOFF < 0)
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
112 # error Py_HASH_CUTOFF must in range 0...7.
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
113 #endif /* Py_HASH_CUTOFF */
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
114
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
115
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
116 /* hash algorithm selection
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
117 *
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
118 * The values for Py_HASH_SIPHASH24 and Py_HASH_FNV are hard-coded in the
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
119 * configure script.
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
120 *
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
121 * - FNV is available on all platforms and architectures.
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
122 * - SIPHASH24 only works on plaforms that provide PY_UINT64_T and doesn't
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
123 * require aligned memory for integers.
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
124 * - With EXTERNAL embedders can provide an alternative implementation with::
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
125 *
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
126 * PyHash_FuncDef PyHash_Func = {...};
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
127 *
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
128 * XXX: Figure out __declspec() for extern PyHash_FuncDef.
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
129 */
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
130 #define Py_HASH_EXTERNAL 0
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
131 #define Py_HASH_SIPHASH24 1
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
132 #define Py_HASH_FNV 2
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
133
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
134 #ifndef Py_HASH_ALGORITHM
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
135 # if (defined(PY_UINT64_T) && defined(PY_UINT32_T) \
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
136 && !defined(HAVE_ALIGNED_REQUIRED))
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
137 # define Py_HASH_ALGORITHM Py_HASH_SIPHASH24
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
138 # else
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
139 # define Py_HASH_ALGORITHM Py_HASH_FNV
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
140 # endif /* uint64_t && uint32_t && aligned */
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
141 #endif /* Py_HASH_ALGORITHM */
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
142
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
143 #ifdef __cplusplus
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
144 }
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
145 #endif
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
146
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
147 #endif /* !Py_HASH_H */