#ifndef Py_HASH_H #define Py_HASH_H #ifdef __cplusplus extern "C" { #endif /* Helpers for hash functions */ #ifndef Py_LIMITED_API PyAPI_FUNC(Py_hash_t) _Py_HashDouble(double); PyAPI_FUNC(Py_hash_t) _Py_HashPointer(const void*); // Similar to _Py_HashPointer(), but don't replace -1 with -2 PyAPI_FUNC(Py_hash_t) _Py_HashPointerRaw(const void*); PyAPI_FUNC(Py_hash_t) _Py_HashBytes(const void*, Py_ssize_t); #endif /* Prime multiplier used in string and various other hashes. */ #define _PyHASH_MULTIPLIER 1000003UL /* 0xf4243 */ /* Parameters used for the numeric hash implementation. See notes for _Py_HashDouble in Python/pyhash.c. Numeric hashes are based on reduction modulo the prime 2**_PyHASH_BITS - 1. */ #if SIZEOF_VOID_P >= 8 # define _PyHASH_BITS 61 #else # define _PyHASH_BITS 31 #endif #define _PyHASH_MODULUS (((size_t)1 << _PyHASH_BITS) - 1) #define _PyHASH_INF 314159 #define _PyHASH_NAN 0 #define _PyHASH_IMAG _PyHASH_MULTIPLIER /* hash secret * * memory layout on 64 bit systems * cccccccc cccccccc cccccccc uc -- unsigned char[24] * pppppppp ssssssss ........ fnv -- two Py_hash_t * k0k0k0k0 k1k1k1k1 ........ siphash -- two uint64_t * ........ ........ ssssssss djbx33a -- 16 bytes padding + one Py_hash_t * ........ ........ eeeeeeee pyexpat XML hash salt * * memory layout on 32 bit systems * cccccccc cccccccc cccccccc uc * ppppssss ........ ........ fnv -- two Py_hash_t * k0k0k0k0 k1k1k1k1 ........ siphash -- two uint64_t (*) * ........ ........ ssss.... djbx33a -- 16 bytes padding + one Py_hash_t * ........ ........ eeee.... pyexpat XML hash salt * * (*) The siphash member may not be available on 32 bit platforms without * an unsigned int64 data type. */ #ifndef Py_LIMITED_API typedef union { /* ensure 24 bytes */ unsigned char uc[24]; /* two Py_hash_t for FNV */ struct { Py_hash_t prefix; Py_hash_t suffix; } fnv; /* two uint64 for SipHash24 */ struct { uint64_t k0; uint64_t k1; } siphash; /* a different (!) Py_hash_t for small string optimization */ struct { unsigned char padding[16]; Py_hash_t suffix; } djbx33a; struct { unsigned char padding[16]; Py_hash_t hashsalt; } expat; } _Py_HashSecret_t; PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; #endif #ifdef Py_DEBUG PyAPI_DATA(int) _Py_HashSecret_Initialized; #endif /* hash function definition */ #ifndef Py_LIMITED_API typedef struct { Py_hash_t (*const hash)(const void *, Py_ssize_t); const char *name; const int hash_bits; const int seed_bits; } PyHash_FuncDef; PyAPI_FUNC(PyHash_FuncDef*) PyHash_GetFuncDef(void); #endif /* cutoff for small string DJBX33A optimization in range [1, cutoff). * * About 50% of the strings in a typical Python application are smaller than * 6 to 7 chars. However DJBX33A is vulnerable to hash collision attacks. * NEVER use DJBX33A for long strings! * * A Py_HASH_CUTOFF of 0 disables small string optimization. 32 bit platforms * should use a smaller cutoff because it is easier to create colliding * strings. A cutoff of 7 on 64bit platforms and 5 on 32bit platforms should * provide a decent safety margin. */ #ifndef Py_HASH_CUTOFF # define Py_HASH_CUTOFF 0 #elif (Py_HASH_CUTOFF > 7 || Py_HASH_CUTOFF < 0) # error Py_HASH_CUTOFF must in range 0...7. #endif /* Py_HASH_CUTOFF */ /* hash algorithm selection * * The values for Py_HASH_SIPHASH24 and Py_HASH_FNV are hard-coded in the * configure script. * * - FNV is available on all platforms and architectures. * - SIPHASH24 only works on platforms that don't require aligned memory for integers. * - With EXTERNAL embedders can provide an alternative implementation with:: * * PyHash_FuncDef PyHash_Func = {...}; * * XXX: Figure out __declspec() for extern PyHash_FuncDef. */ #define Py_HASH_EXTERNAL 0 #define Py_HASH_SIPHASH24 1 #define Py_HASH_FNV 2 #ifndef Py_HASH_ALGORITHM # ifndef HAVE_ALIGNED_REQUIRED # define Py_HASH_ALGORITHM Py_HASH_SIPHASH24 # else # define Py_HASH_ALGORITHM Py_HASH_FNV # endif /* uint64_t && uint32_t && aligned */ #endif /* Py_HASH_ALGORITHM */ #ifdef __cplusplus } #endif #endif /* !Py_HASH_H */
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
cpython | Folder | 0755 |
|
|
internal | Folder | 0755 |
|
|
Python-ast.h | File | 25.58 KB | 0644 |
|
Python.h | File | 3.45 KB | 0644 |
|
abstract.h | File | 29.76 KB | 0644 |
|
asdl.h | File | 1.2 KB | 0644 |
|
ast.h | File | 947 B | 0644 |
|
bitset.h | File | 468 B | 0644 |
|
bltinmodule.h | File | 264 B | 0644 |
|
boolobject.h | File | 885 B | 0644 |
|
bytearrayobject.h | File | 1.45 KB | 0644 |
|
bytesobject.h | File | 2.98 KB | 0644 |
|
cellobject.h | File | 712 B | 0644 |
|
ceval.h | File | 5.81 KB | 0644 |
|
classobject.h | File | 1.62 KB | 0644 |
|
code.h | File | 318 B | 0644 |
|
codecs.h | File | 6.63 KB | 0644 |
|
compile.h | File | 3.69 KB | 0644 |
|
complexobject.h | File | 1.76 KB | 0644 |
|
context.h | File | 1.92 KB | 0644 |
|
datetime.h | File | 9.04 KB | 0644 |
|
descrobject.h | File | 2.95 KB | 0644 |
|
dictobject.h | File | 3.63 KB | 0644 |
|
dynamic_annotations.h | File | 21.94 KB | 0644 |
|
enumobject.h | File | 253 B | 0644 |
|
errcode.h | File | 1.59 KB | 0644 |
|
eval.h | File | 1.18 KB | 0644 |
|
exports.h | File | 1.07 KB | 0644 |
|
fileobject.h | File | 1.53 KB | 0644 |
|
fileutils.h | File | 597 B | 0644 |
|
floatobject.h | File | 4.26 KB | 0644 |
|
frameobject.h | File | 337 B | 0644 |
|
funcobject.h | File | 3.96 KB | 0644 |
|
genericaliasobject.h | File | 334 B | 0644 |
|
genobject.h | File | 3.44 KB | 0644 |
|
graminit.h | File | 2.07 KB | 0644 |
|
grammar.h | File | 1.78 KB | 0644 |
|
import.h | File | 2.96 KB | 0644 |
|
interpreteridobject.h | File | 334 B | 0644 |
|
intrcheck.h | File | 861 B | 0644 |
|
iterobject.h | File | 521 B | 0644 |
|
listobject.h | File | 1.74 KB | 0644 |
|
longintrepr.h | File | 3.71 KB | 0644 |
|
longobject.h | File | 9.29 KB | 0644 |
|
marshal.h | File | 803 B | 0644 |
|
memoryobject.h | File | 2.7 KB | 0644 |
|
methodobject.h | File | 3.69 KB | 0644 |
|
modsupport.h | File | 9.73 KB | 0644 |
|
moduleobject.h | File | 2.31 KB | 0644 |
|
namespaceobject.h | File | 349 B | 0644 |
|
node.h | File | 1.25 KB | 0644 |
|
object.h | File | 24.05 KB | 0644 |
|
objimpl.h | File | 8.23 KB | 0644 |
|
odictobject.h | File | 1.27 KB | 0644 |
|
opcode.h | File | 4.79 KB | 0644 |
|
osdefs.h | File | 737 B | 0644 |
|
osmodule.h | File | 291 B | 0644 |
|
parsetok.h | File | 2.89 KB | 0644 |
|
patchlevel.h | File | 1.27 KB | 0644 |
|
picklebufobject.h | File | 846 B | 0644 |
|
py_curses.h | File | 2.42 KB | 0644 |
|
pyarena.h | File | 2.68 KB | 0644 |
|
pycapsule.h | File | 1.68 KB | 0644 |
|
pyconfig-64.h | File | 46.88 KB | 0644 |
|
pyconfig.h | File | 162 B | 0644 |
|
pyctype.h | File | 1.35 KB | 0644 |
|
pydebug.h | File | 1.07 KB | 0644 |
|
pydtrace.h | File | 2.36 KB | 0644 |
|
pyerrors.h | File | 12.14 KB | 0644 |
|
pyexpat.h | File | 2.51 KB | 0644 |
|
pyfpe.h | File | 444 B | 0644 |
|
pyframe.h | File | 466 B | 0644 |
|
pyhash.h | File | 4.16 KB | 0644 |
|
pylifecycle.h | File | 2.09 KB | 0644 |
|
pymacconfig.h | File | 2.92 KB | 0644 |
|
pymacro.h | File | 4.8 KB | 0644 |
|
pymath.h | File | 8.38 KB | 0644 |
|
pymem.h | File | 4.3 KB | 0644 |
|
pyport.h | File | 30.54 KB | 0644 |
|
pystate.h | File | 5.13 KB | 0644 |
|
pystrcmp.h | File | 436 B | 0644 |
|
pystrhex.h | File | 849 B | 0644 |
|
pystrtod.h | File | 1.45 KB | 0644 |
|
pythonrun.h | File | 7.49 KB | 0644 |
|
pythread.h | File | 5.8 KB | 0644 |
|
pytime.h | File | 8.72 KB | 0644 |
|
rangeobject.h | File | 628 B | 0644 |
|
setobject.h | File | 3.25 KB | 0644 |
|
sliceobject.h | File | 2.46 KB | 0644 |
|
structmember.h | File | 1.98 KB | 0644 |
|
structseq.h | File | 1.36 KB | 0644 |
|
symtable.h | File | 5.18 KB | 0644 |
|
sysmodule.h | File | 1.21 KB | 0644 |
|
token.h | File | 2.58 KB | 0644 |
|
traceback.h | File | 584 B | 0644 |
|
tracemalloc.h | File | 1.09 KB | 0644 |
|
tupleobject.h | File | 1.58 KB | 0644 |
|
typeslots.h | File | 2.29 KB | 0644 |
|
ucnhash.h | File | 1.03 KB | 0644 |
|
unicodeobject.h | File | 34.6 KB | 0644 |
|
warnings.h | File | 1.73 KB | 0644 |
|
weakrefobject.h | File | 2.8 KB | 0644 |
|