Perl使用什么哈希函数/算法? [英] What hashing function/algorithm does Perl use ?

查看:88
本文介绍了Perl使用什么哈希函数/算法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您是否可以对Perl用于将字符串映射到索引的哈希函数/算法有所了解?有相关读物吗?

解决方案

[此答案早于在5.28中进行的哈希函数更改.请参阅 perldelta中的5.28 中的默认哈希函数更改".]

PERL_HASH_INTERNAL_,在 hv.h ,复制如下:

 /* hash a key */
/* FYI: This is the "One-at-a-Time" algorithm by Bob Jenkins
 * from requirements by Colin Plumb.
 * (http://burtleburtle.net/bob/hash/doobs.html) */
/* The use of a temporary pointer and the casting games
 * is needed to serve the dual purposes of
 * (a) the hashed data being interpreted as "unsigned char" (new since 5.8,
 *     a "char" can be either signed or unsigned, depending on the compiler)
 * (b) catering for old code that uses a "char"
 *
 * The "hash seed" feature was added in Perl 5.8.1 to perturb the results
 * to avoid "algorithmic complexity attacks".
 *
 * If USE_HASH_SEED is defined, hash randomisation is done by default
 * If USE_HASH_SEED_EXPLICIT is defined, hash randomisation is done
 * only if the environment variable PERL_HASH_SEED is set.
 * For maximal control, one can define PERL_HASH_SEED.
 * (see also perl.c:perl_parse()).
 */

#define PERL_HASH_INTERNAL_(hash,str,len,internal) \
    STMT_START { \
       register const char * const s_PeRlHaSh_tmp = str; \
       register const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; \
       register I32 i_PeRlHaSh = len; \
       register U32 hash_PeRlHaSh = (internal ? PL_rehash_seed : PERL_HASH_SEED); \
       while (i_PeRlHaSh--) { \
           hash_PeRlHaSh += *s_PeRlHaSh++; \
           hash_PeRlHaSh += (hash_PeRlHaSh << 10); \
           hash_PeRlHaSh ^= (hash_PeRlHaSh >> 6); \
       } \
       hash_PeRlHaSh += (hash_PeRlHaSh << 3); \
       hash_PeRlHaSh ^= (hash_PeRlHaSh >> 11); \
       (hash) = (hash_PeRlHaSh + (hash_PeRlHaSh << 15)); \
   } STMT_END
 

Could you someone shed some light on the hashing function/algorithm Perl uses to map a string to an index ? Any relevant reading ?

解决方案

[This answer predates the hashing function change made in 5.28. See "Default Hash Function Change" in the perldelta for 5.28.]

PERL_HASH_INTERNAL_, defined in hv.h, copied below:

/* hash a key */
/* FYI: This is the "One-at-a-Time" algorithm by Bob Jenkins
 * from requirements by Colin Plumb.
 * (http://burtleburtle.net/bob/hash/doobs.html) */
/* The use of a temporary pointer and the casting games
 * is needed to serve the dual purposes of
 * (a) the hashed data being interpreted as "unsigned char" (new since 5.8,
 *     a "char" can be either signed or unsigned, depending on the compiler)
 * (b) catering for old code that uses a "char"
 *
 * The "hash seed" feature was added in Perl 5.8.1 to perturb the results
 * to avoid "algorithmic complexity attacks".
 *
 * If USE_HASH_SEED is defined, hash randomisation is done by default
 * If USE_HASH_SEED_EXPLICIT is defined, hash randomisation is done
 * only if the environment variable PERL_HASH_SEED is set.
 * For maximal control, one can define PERL_HASH_SEED.
 * (see also perl.c:perl_parse()).
 */

#define PERL_HASH_INTERNAL_(hash,str,len,internal) \
    STMT_START { \
       register const char * const s_PeRlHaSh_tmp = str; \
       register const unsigned char *s_PeRlHaSh = (const unsigned char *)s_PeRlHaSh_tmp; \
       register I32 i_PeRlHaSh = len; \
       register U32 hash_PeRlHaSh = (internal ? PL_rehash_seed : PERL_HASH_SEED); \
       while (i_PeRlHaSh--) { \
           hash_PeRlHaSh += *s_PeRlHaSh++; \
           hash_PeRlHaSh += (hash_PeRlHaSh << 10); \
           hash_PeRlHaSh ^= (hash_PeRlHaSh >> 6); \
       } \
       hash_PeRlHaSh += (hash_PeRlHaSh << 3); \
       hash_PeRlHaSh ^= (hash_PeRlHaSh >> 11); \
       (hash) = (hash_PeRlHaSh + (hash_PeRlHaSh << 15)); \
   } STMT_END

这篇关于Perl使用什么哈希函数/算法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆