diff options
Diffstat (limited to 'Python/pyhash.c')
| -rw-r--r-- | Python/pyhash.c | 29 | 
1 files changed, 21 insertions, 8 deletions
| diff --git a/Python/pyhash.c b/Python/pyhash.c index aa49eeb35b..bc6786c7b8 100644 --- a/Python/pyhash.c +++ b/Python/pyhash.c @@ -284,7 +284,6 @@ static PyHash_FuncDef PyHash_Func = {fnv, "fnv", 8 * SIZEOF_PY_HASH_T,  #endif /* Py_HASH_ALGORITHM == Py_HASH_FNV */ -#if Py_HASH_ALGORITHM == Py_HASH_SIPHASH24  /* **************************************************************************   <MIT License>   Copyright (c) 2013  Marek Majkowski <marek@popcount.org> @@ -364,10 +363,10 @@ static PyHash_FuncDef PyHash_Func = {fnv, "fnv", 8 * SIZEOF_PY_HASH_T,      HALF_ROUND(v2,v1,v0,v3,17,21); -static Py_hash_t -siphash24(const void *src, Py_ssize_t src_sz) { -    uint64_t k0 = _le64toh(_Py_HashSecret.siphash.k0); -    uint64_t k1 = _le64toh(_Py_HashSecret.siphash.k1); +static uint64_t +siphash24(uint64_t key0, uint64_t key1, const void *src, Py_ssize_t src_sz) { +    uint64_t k0 = _le64toh(key0); +    uint64_t k1 = _le64toh(key1);      uint64_t b = (uint64_t)src_sz << 56;      const uint64_t *in = (uint64_t*)src; @@ -412,12 +411,26 @@ siphash24(const void *src, Py_ssize_t src_sz) {      /* modified */      t = (v0 ^ v1) ^ (v2 ^ v3); -    return (Py_hash_t)t; +    return t; +} + +static Py_hash_t +pysiphash(const void *src, Py_ssize_t src_sz) { +    return (Py_hash_t)siphash24( +        _Py_HashSecret.siphash.k0, _Py_HashSecret.siphash.k1, +        src, src_sz); +} + +uint64_t +_Py_KeyedHash(uint64_t key, const void *src, Py_ssize_t src_sz) +{ +    return siphash24(key, 0, src, src_sz);  } -static PyHash_FuncDef PyHash_Func = {siphash24, "siphash24", 64, 128}; -#endif /* Py_HASH_ALGORITHM == Py_HASH_SIPHASH24 */ +#if Py_HASH_ALGORITHM == Py_HASH_SIPHASH24 +static PyHash_FuncDef PyHash_Func = {pysiphash, "siphash24", 64, 128}; +#endif  #ifdef __cplusplus  } | 
