hash算法

作者: 周荣华zte | 来源:发表于2021-02-23 02:43 被阅读0次

简单一点的hash算法就是直接取模。

高级一点的hash算法会乘以一个大素数来将源数据的分布规律变得不那么明显,也就是说,不论输入的是一串分布很紧凑的数字序列还是很稀疏的数字序列,生成的结果都是非常分散的数字序列。

linux内核代码里面的这个hash要更高一级,包含2个特征,最接近32位或者64位上限黄金分割点的素数,只需要最少的移位和求和就能生成。

前者确保即使是1,2这样的小数也会被乘溢出,被轻易打散。

后者确保任何一个整数乘这个大素数的时候都可以通过最少的移位和求和即可得到乘积,不用傻傻的真的相乘。

/* 2^31 + 2^29 - 2^25 + 2^22 - 2^19 - 2^16 + 1 */

#define GOLDEN_RATIO_PRIME_32 0x9e370001UL

/*  2^63 + 2^61 - 2^57 + 2^54 - 2^51 - 2^18 + 1 */

#define GOLDEN_RATIO_PRIME_64 0x9e37fffffffc0001UL

#if BITS_PER_LONG == 32

#define GOLDEN_RATIO_PRIME GOLDEN_RATIO_PRIME_32

#define hash_long(val, bits) hash_32(val, bits)

#elif BITS_PER_LONG == 64

#define hash_long(val, bits) hash_64(val, bits)

#define GOLDEN_RATIO_PRIME GOLDEN_RATIO_PRIME_64

#else

#error Wordsize not 32 or 64

#endif

static inline u64 hash_64(u64 val, unsigned int bits)

{

    u64 hash = val;

    /*  Sigh, gcc can't optimise this alone like it does for 32 bits. */

    u64 n = hash;

    n <<= 18;

    hash -= n;

    n <<= 33;

    hash -= n;

    n <<= 3;

    hash += n;

    n <<= 3;

    hash -= n;

    n <<= 4;

    hash += n;

    n <<= 2;

    hash += n;

    /* High bits are more random, so use them. */

    return hash >> (64 - bits);

}

static inline u32 hash_32(u32 val, unsigned int bits)

{

    /* On some cpus multiply is faster, on others gcc will do shifts */

    u32 hash = val * GOLDEN_RATIO_PRIME_32;

    /* High bits are more random, so use them. */

    return hash >> (32 - bits);

}

static inline unsigned long hash_ptr(const void *ptr, unsigned int bits)

{

    return hash_long((unsigned long)ptr, bits);

}

#endif /* _LINUX_HASH_H */

相关文章

  • 分布式集群架构场景化解决方案

    一致性hash算法hash算法应用场景普通hash算法存在的问题一致性hash算法手写一致性hash算法nginx...

  • 哈希算法

    哈希算法 什么是hash函数?常见的hash算法hashlib的用法hash算法的用途 什么是hash函数? 哈希...

  • IOS 逆向开发(二)密码学 HASH

    1. HASH算法简介 1.1 HASH是什么? Hash算法(也叫散列算法) Hash,一般翻译做“散列”,也有...

  • 负载均衡中的一致性hash算法

    hash简介 说到底,他是一种hash算法,那什么是hash算法?hash算法是一种散列算法,常用的比如MD5。抽...

  • 哈希(散列函数)

    力扣题库极客时间 Hash算法也被称为散列算法,Hash算法虽然被称为算法,但实际上它更像是一种思想。Hash算法...

  • Hash一致性算法浅析

    Ngnix负载均衡策略包含Hash算法,就是通过Hash算法将请求hash求值,根据hash值定向到服务器。 假定...

  • 一致性hash算法

    Hash 算法也叫做散列算法,他可以让任意长度的数据M映射成为长度固定的值H。 Hash算法的作用 Hash算法的...

  • 一致性hash算法

    一致性hash算法 1.hash算法 先说一下hash算法,hash算法是将任意长度的二进制值映射为固定长度的二进...

  • Hash算法

    数据结构与算法分析:大纲数据结构:数组算法:hash算法算法:排序算法Java实现 1 Hash算法? 将任意长度...

  • 1. IOS 字典研究

    一: Hash 算法 1. hash算法 hash称为散列表,其实本质上还是一个数组。主要是通过 hash(key...

网友评论

    本文标题:hash算法

    本文链接:https://www.haomeiwen.com/subject/ajewzktx.html