A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/python/cpython/commit/985ecdcfc29adfc36ce2339acf03f819ad414869 below:

Implement PEP 456 'secure and interchangeable hash algor… · python/cpython@985ecdc · GitHub

1 +

#ifndef Py_HASH_H

2 + 3 +

#define Py_HASH_H

4 +

#ifdef __cplusplus

5 +

extern "C" {

6 +

#endif

7 + 8 +

/* Helpers for hash functions */

9 +

#ifndef Py_LIMITED_API

10 +

PyAPI_FUNC(Py_hash_t) _Py_HashDouble(double);

11 +

PyAPI_FUNC(Py_hash_t) _Py_HashPointer(void*);

12 +

PyAPI_FUNC(Py_hash_t) _Py_HashBytes(const void*, Py_ssize_t);

13 +

#endif

14 + 15 +

/* Prime multiplier used in string and various other hashes. */

16 +

#define _PyHASH_MULTIPLIER 1000003UL /* 0xf4243 */

17 + 18 +

/* Parameters used for the numeric hash implementation. See notes for

19 +

_Py_HashDouble in Objects/object.c. Numeric hashes are based on

20 +

reduction modulo the prime 2**_PyHASH_BITS - 1. */

21 + 22 +

#if SIZEOF_VOID_P >= 8

23 +

# define _PyHASH_BITS 61

24 +

#else

25 +

# define _PyHASH_BITS 31

26 +

#endif

27 + 28 +

#define _PyHASH_MODULUS (((size_t)1 << _PyHASH_BITS) - 1)

29 +

#define _PyHASH_INF 314159

30 +

#define _PyHASH_NAN 0

31 +

#define _PyHASH_IMAG _PyHASH_MULTIPLIER

32 + 33 + 34 +

/* hash secret

35 +

*

36 +

* memory layout on 64 bit systems

37 +

* cccccccc cccccccc cccccccc uc -- unsigned char[24]

38 +

* pppppppp ssssssss ........ fnv -- two Py_hash_t

39 +

* k0k0k0k0 k1k1k1k1 ........ siphash -- two PY_UINT64_T

40 +

* ........ ........ ssssssss djbx33a -- 16 bytes padding + one Py_hash_t

41 +

* ........ ........ eeeeeeee pyexpat XML hash salt

42 +

*

43 +

* memory layout on 32 bit systems

44 +

* cccccccc cccccccc cccccccc uc

45 +

* ppppssss ........ ........ fnv -- two Py_hash_t

46 +

* k0k0k0k0 k1k1k1k1 ........ siphash -- two PY_UINT64_T (*)

47 +

* ........ ........ ssss.... djbx33a -- 16 bytes padding + one Py_hash_t

48 +

* ........ ........ eeee.... pyexpat XML hash salt

49 +

*

50 +

* (*) The siphash member may not be available on 32 bit platforms without

51 +

* an unsigned int64 data type.

52 +

*/

53 +

typedef union {

54 +

/* ensure 24 bytes */

55 +

unsigned char uc[24];

56 +

/* two Py_hash_t for FNV */

57 +

struct {

58 +

Py_hash_t prefix;

59 +

Py_hash_t suffix;

60 +

} fnv;

61 +

#ifdef PY_UINT64_T

62 +

/* two uint64 for SipHash24 */

63 +

struct {

64 +

PY_UINT64_T k0;

65 +

PY_UINT64_T k1;

66 +

} siphash;

67 +

#endif

68 +

/* a different (!) Py_hash_t for small string optimization */

69 +

struct {

70 +

unsigned char padding[16];

71 +

Py_hash_t suffix;

72 +

} djbx33a;

73 +

struct {

74 +

unsigned char padding[16];

75 +

Py_hash_t hashsalt;

76 +

} expat;

77 +

} _Py_HashSecret_t;

78 +

PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret;

79 + 80 +

#ifdef Py_DEBUG

81 +

PyAPI_DATA(int) _Py_HashSecret_Initialized;

82 +

#endif

83 + 84 + 85 +

/* hash function definition */

86 +

#ifndef Py_LIMITED_API

87 +

typedef struct {

88 +

Py_hash_t (*const hash)(const void *, Py_ssize_t);

89 +

const char *name;

90 +

const int hash_bits;

91 +

const int seed_bits;

92 +

} PyHash_FuncDef;

93 + 94 +

PyAPI_FUNC(PyHash_FuncDef*) PyHash_GetFuncDef(void);

95 +

#endif

96 + 97 + 98 +

/* cutoff for small string DJBX33A optimization in range [1, cutoff).

99 +

*

100 +

* About 50% of the strings in a typical Python application are smaller than

101 +

* 6 to 7 chars. However DJBX33A is vulnerable to hash collision attacks.

102 +

* NEVER use DJBX33A for long strings!

103 +

*

104 +

* A Py_HASH_CUTOFF of 0 disables small string optimization. 32 bit platforms

105 +

* should use a smaller cutoff because it is easier to create colliding

106 +

* strings. A cutoff of 7 on 64bit platforms and 5 on 32bit platforms should

107 +

* provide a decent safety margin.

108 +

*/

109 +

#ifndef Py_HASH_CUTOFF

110 +

# define Py_HASH_CUTOFF 0

111 +

#elif (Py_HASH_CUTOFF > 7 || Py_HASH_CUTOFF < 0)

112 +

# error Py_HASH_CUTOFF must in range 0...7.

113 +

#endif /* Py_HASH_CUTOFF */

114 + 115 + 116 +

/* hash algorithm selection

117 +

*

118 +

* The values for Py_HASH_SIPHASH24 and Py_HASH_FNV are hard-coded in the

119 +

* configure script.

120 +

*

121 +

* - FNV is available on all platforms and architectures.

122 +

* - SIPHASH24 only works on plaforms that provide PY_UINT64_T and doesn't

123 +

* require aligned memory for integers.

124 +

* - With EXTERNAL embedders can provide an alternative implementation with::

125 +

*

126 +

* PyHash_FuncDef PyHash_Func = {...};

127 +

*

128 +

* XXX: Figure out __declspec() for extern PyHash_FuncDef.

129 +

*/

130 +

#define Py_HASH_EXTERNAL 0

131 +

#define Py_HASH_SIPHASH24 1

132 +

#define Py_HASH_FNV 2

133 + 134 +

#ifndef Py_HASH_ALGORITHM

135 +

# if (defined(PY_UINT64_T) && defined(PY_UINT32_T) \

136 +

&& !defined(HAVE_ALIGNED_REQUIRED))

137 +

# define Py_HASH_ALGORITHM Py_HASH_SIPHASH24

138 +

# else

139 +

# define Py_HASH_ALGORITHM Py_HASH_FNV

140 +

# endif /* uint64_t && uint32_t && aligned */

141 +

#endif /* Py_HASH_ALGORITHM */

142 + 143 +

#ifdef __cplusplus

144 +

}

145 +

#endif

146 + 147 +

#endif /* !Py_HASH_H */


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4