[Python-checkins] peps: PEP 456: drop pluggable and go for compile time configuration of the hash
christian.heimes
python-checkins at python.org
Sun Oct 6 14:28:47 CEST 2013
http://hg.python.org/peps/rev/1d56df07dfe9
changeset: 5170:1d56df07dfe9
user: Christian Heimes <christian at cheimes.de>
date: Sun Oct 06 14:28:39 2013 +0200
summary:
PEP 456: drop pluggable and go for compile time configuration of the hash algorithm.
files:
pep-0456.txt | 81 ++++++++++++++++-----------------------
1 files changed, 34 insertions(+), 47 deletions(-)
diff --git a/pep-0456.txt b/pep-0456.txt
--- a/pep-0456.txt
+++ b/pep-0456.txt
@@ -1,5 +1,5 @@
PEP: 456
-Title: Pluggable and secure hash algorithm
+Title: Secure and interchangeable hash algorithm
Version: $Revision$
Last-Modified: $Date$
Author: Christian Heimes <christian at python.org>
@@ -8,16 +8,16 @@
Content-Type: text/x-rst
Created: 27-Sep-2013
Python-Version: 3.4
-Post-History:
+Post-History: 06-Oct-2013
Abstract
========
This PEP proposes SipHash as default string and bytes hash algorithm to properly
-fix hash randomization once and for all. It also proposes an addition to
-Python's C API in order to make the hash code pluggable. The new API allows to
-select the algorithm on startup as well as the addition of more hash algorithms.
+fix hash randomization once and for all. It also proposes modifications to
+Python's C code in order to unify the hash code and to make it easily
+interchangeable.
Rationale
@@ -57,10 +57,8 @@
``Objects/object.c`` and ``Objects/unicodeobject.c``. The function takes a
void pointer plus length and returns the hash for it.
-* The algorithm can be selected by the user with an environment variable,
- command line argument or with an API function (for embedders). FNV is
- guaranteed to exist on all platforms. SipHash is available on the majority
- of modern systems.
+* The algorithm can be selected at compile time. FNV is guaranteed to exist
+ on all platforms. SipHash is available on the majority of modern systems.
Requirements for a hash function
@@ -321,50 +319,25 @@
type definition::
typedef struct {
- PyHash_Func hashfunc; /* function pointer */
+ PyHash_Func hash; /* function pointer */
char *name; /* name of the hash algorithm and variant */
int hash_bits; /* internal size of hash value */
int seed_bits; /* size of seed input */
- int precedence; /* ranking for auto-selection */
- } PyHash_FuncDef;
+ } _PyHash_FuncDef;
- PyAPI_DATA(PyHash_FuncDef *) PyHash_FuncTable;
+ PyAPI_DATA(_PyHash_FuncDef *) _PyHash_Func;
Implementation::
- PyHash_FuncDef hash_func_table[] = {
- {fnv, "fnv", 64, 128, 10},
+ #ifndef PY_HASH_FUNC
#ifdef PY_UINT64_T
- {siphash24, "sip24", sizeof(Py_hash_t)*8, sizeof(Py_hash_t)*8, 20},
+ _PyHash_Func = {siphash24, "sip24", 64, 128}
+ #else
+ _PyHash_Func = {fnv, "fnv", 8 * sizeof(Py_hash_t), 16 * sizeof(Py_hash_t)}
#endif
- {NULL, NULL},
- };
+ #endif
- PyHash_FuncDef *PyHash_FuncTable = hash_func_table;
-
-
-hash function API
------------------
-
-function proto types::
-
- PyAPI_FUNC(int) PyHash_SetHashAlgorithm(char *name);
-
- PyAPI_FUNC(PyHash_FuncDef *) PyHash_GetHashAlgorithm(void);
-
- PyAPI_DATA(PyHash_FuncDef *) _PyHash_Func;
-
-``PyHash_SetHashAlgorithm(NULL)`` selects the hash algorithm with the highest
-precedence. ``PyHash_SetHashAlgorithm("sip24")`` selects siphash24 as hash
-algorithm. The function returns ``0`` on success. In case the algorithm is
-not supported or a hash algorithm is already set it returns ``-1``.
-(XXX use enum?)
-
-``PyHash_GetHashAlgorithm()`` returns a pointer to current hash function
-definition or `NULL`.
-
-``_PyHash_Func`` holds the set hash function definition. It can't be modified
-or reset once a hash algorithm is set.
+TODO: select hash algorithm with autoconf variable
Python API addition
@@ -379,9 +352,8 @@
::
sys.hash_info(algorithm='siphash24',
- available_algorithms=('siphash24', 'fnv'),
hash_bits=64,
- hash_output=64, # sizeof(Py_hash_t)*8
+ hash_output=64, # 8 * sizeof(Py_hash_t)
seed_bits=128)
@@ -439,8 +411,8 @@
if (PyUnicode_READY(u) == -1)
return -1;
- x = _PyHash_Func->hashfunc(PyUnicode_DATA(u),
- PyUnicode_GET_LENGTH(u) * PyUnicode_KIND(u));
+ x = _PyHash_Func->hash(PyUnicode_DATA(u),
+ PyUnicode_GET_LENGTH(u) * PyUnicode_KIND(u));
generic_hash (Modules/_datetimemodule.c)
@@ -534,6 +506,19 @@
prefixes are stored within the tree structure.
+Discussion
+==========
+
+Pluggable
+---------
+
+The first draft of this PEP made the hash algorithm pluggable at runtime. It
+supported multiple hash algorithms in one binary to give the user the
+possibility to select a hash algorithm at startup. The approach was considered
+an unnecessary complication by several core committers [pluggable]_. Subsequent
+versions of the PEP aim for compile time configuration.
+
+
Reference
=========
@@ -567,6 +552,8 @@
.. [aes-ni] http://en.wikipedia.org/wiki/AES_instruction_set
+.. [pluggable] https://mail.python.org/pipermail/python-dev/2013-October/129138.html
+
Copyright
=========
--
Repository URL: http://hg.python.org/peps
More information about the Python-checkins
mailing list