`
zhanghe086
  • 浏览: 55594 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hash算法大全(java实现)

 
阅读更多
package com.conan;

/**
* Hash算法大全<br>
* 推荐使用FNV1算法
*
* @algorithm None
* @author Goodzzp 2006-11-20
* @lastEdit Goodzzp 2006-11-20
* @editDetail Create
*/
public class HashAlgorithms {

    /**
     * 加法hash
     *
     * @param key
     *            字符串
     * @param prime
     *            一个质数
     * @return hash结果
     */
    public static int additiveHash(String key, int prime) {
        int hash, i;
        for (hash = key.length(), i = 0; i < key.length(); i++)
            hash += key.charAt(i);
        return (hash % prime);
    }

    /**
     * 旋转hash
     *
     * @param key
     *            输入字符串
     * @param prime
     *            质数
     * @return hash值
     */
    public static int rotatingHash(String key, int prime) {
        int hash, i;
        for (hash = key.length(), i = 0; i < key.length(); ++i)
            hash = (hash << 4) ^ (hash >> 28) ^ key.charAt(i);
        return (hash % prime);
        // return (hash ^ (hash>>10) ^ (hash>>20));
    }

    // 替代:
    // 使用:hash = (hash ^ (hash>>10) ^ (hash>>20)) & mask;
    // 替代:hash %= prime;

    /**
     * MASK值,随便找一个值,最好是质数
     */
    static int M_MASK = 0x8765fed1;

    /**
     * 一次一个hash
     *
     * @param key
     *            输入字符串
     * @return 输出hash值
     */
    public static int oneByOneHash(String key) {
        int hash, i;
        for (hash = 0, i = 0; i < key.length(); ++i) {
            hash += key.charAt(i);
            hash += (hash << 10);
            hash ^= (hash >> 6);
        }
        hash += (hash << 3);
        hash ^= (hash >> 11);
        hash += (hash << 15);
        // return (hash & M_MASK);
        return hash;
    }

    /**
     * Bernstein's hash
     *
     * @param key
     *            输入字节数组
     * @param level
     *            初始hash常量
     * @return 结果hash
     */
    public static int bernstein(String key) {
        int hash = 0;
        int i;
        for (i = 0; i < key.length(); ++i)
            hash = 33 * hash + key.charAt(i);
        return hash;
    }

    //  
    // // Pearson's Hash
    // char pearson(char[]key, ub4 len, char tab[256])
    // {
    // char hash;
    // ub4 i;
    // for (hash=len, i=0; i<len; ++i)
    // hash=tab[hash^key[i]];
    // return (hash);
    // }

    // // CRC Hashing,计算crc,具体代码见其他
    // ub4 crc(char *key, ub4 len, ub4 mask, ub4 tab[256])
    // {
    // ub4 hash, i;
    // for (hash=len, i=0; i<len; ++i)
    // hash = (hash >> ^ tab[(hash & 0xff) ^ key[i]];
    // return (hash & mask);
    // }

    /**
     * Universal Hashing
     */
    public static int universal(char[] key, int mask, int[] tab) {
        int hash = key.length, i, len = key.length;
        for (i = 0; i < (len << 3); i += {
            char k = key[i >> 3];
            if ((k & 0x01) == 0)
                hash ^= tab[i + 0];
            if ((k & 0x02) == 0)
                hash ^= tab[i + 1];
            if ((k & 0x04) == 0)
                hash ^= tab[i + 2];
            if ((k & 0x08) == 0)
                hash ^= tab[i + 3];
            if ((k & 0x10) == 0)
                hash ^= tab[i + 4];
            if ((k & 0x20) == 0)
                hash ^= tab[i + 5];
            if ((k & 0x40) == 0)
                hash ^= tab[i + 6];
            if ((k & 0x80) == 0)
                hash ^= tab[i + 7];
        }
        return (hash & mask);
    }

    /**
     * Zobrist Hashing
     */
    public static int zobrist(char[] key, int mask, int[][] tab) {
        int hash, i;
        for (hash = key.length, i = 0; i < key.length; ++i)
            hash ^= tab[i][key[i]];
        return (hash & mask);
    }

    // LOOKUP3
    // 见Bob Jenkins(3).c文件

    // 32位FNV算法
    static int M_SHIFT = 0;

    /**
     * 32位的FNV算法
     *
     * @param data
     *            数组
     * @return int值
     */
    public static int FNVHash(byte[] data) {
        int hash = (int) 2166136261L;
        for (byte b : data)
            hash = (hash * 16777619) ^ b;
        if (M_SHIFT == 0)
            return hash;
        return (hash ^ (hash >> M_SHIFT)) & M_MASK;
    }

    /**
     * 改进的32位FNV算法1
     *
     * @param data
     *            数组
     * @return int值
     */
    public static int FNVHash1(byte[] data) {
        final int p = 16777619;
        int hash = (int) 2166136261L;
        for (byte b : data)
            hash = (hash ^ b) * p;
        hash += hash << 13;
        hash ^= hash >> 7;
        hash += hash << 3;
        hash ^= hash >> 17;
        hash += hash << 5;
        return hash;
    }

    /**
     * 改进的32位FNV算法1
     *
     * @param data
     *            字符串
     * @return int值
     */
    public static int FNVHash1(String data) {
        final int p = 16777619;
        int hash = (int) 2166136261L;
        for (int i = 0; i < data.length(); i++)
            hash = (hash ^ data.charAt(i)) * p;
        hash += hash << 13;
        hash ^= hash >> 7;
        hash += hash << 3;
        hash ^= hash >> 17;
        hash += hash << 5;
        return hash;
    }

    /**
     * Thomas Wang的算法,整数hash
     */
    public static int intHash(int key) {
        key += ~(key << 15);
        key ^= (key >>> 10);
        key += (key << 3);
        key ^= (key >>> 6);
        key += ~(key << 11);
        key ^= (key >>> 16);
        return key;
    }

    /**
     * RS算法hash
     *
     * @param str
     *            字符串
     */
    public static int RSHash(String str) {
        int b = 378551;
        int a = 63689;
        int hash = 0;

        for (int i = 0; i < str.length(); i++) {
            hash = hash * a + str.charAt(i);
            a = a * b;
        }

        return (hash & 0x7FFFFFFF);
    }

    /* End Of RS Hash Function */

    /**
     * JS算法
     */
    public static int JSHash(String str) {
        int hash = 1315423911;

        for (int i = 0; i < str.length(); i++) {
            hash ^= ((hash << 5) + str.charAt(i) + (hash >> 2));
        }

        return (hash & 0x7FFFFFFF);
    }

    /* End Of JS Hash Function */

    /**
     * PJW算法
     */
    public static int PJWHash(String str) {
        int BitsInUnsignedInt = 32;
        int ThreeQuarters = (BitsInUnsignedInt * 3) / 4;
        int OneEighth = BitsInUnsignedInt / 8;
        int HighBits = 0xFFFFFFFF << (BitsInUnsignedInt - OneEighth);
        int hash = 0;
        int test = 0;

        for (int i = 0; i < str.length(); i++) {
            hash = (hash << OneEighth) + str.charAt(i);

            if ((test = hash & HighBits) != 0) {
                hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));
            }
        }

        return (hash & 0x7FFFFFFF);
    }

    /* End Of P. J. Weinberger Hash Function */

    /**
     * ELF算法
     */
    public static int ELFHash(String str) {
        int hash = 0;
        int x = 0;

        for (int i = 0; i < str.length(); i++) {
            hash = (hash << 4) + str.charAt(i);
            if ((x = (int) (hash & 0xF0000000L)) != 0) {
                hash ^= (x >> 24);
                hash &= ~x;
            }
        }

        return (hash & 0x7FFFFFFF);
    }

    /* End Of ELF Hash Function */

    /**
     * BKDR算法
     */
    public static int BKDRHash(String str) {
        int seed = 131; // 31 131 1313 13131 131313 etc..
        int hash = 0;

        for (int i = 0; i < str.length(); i++) {
            hash = (hash * seed) + str.charAt(i);
        }

        return (hash & 0x7FFFFFFF);
    }

    /* End Of BKDR Hash Function */

    /**
     * SDBM算法
     */
    public static int SDBMHash(String str) {
        int hash = 0;

        for (int i = 0; i < str.length(); i++) {
            hash = str.charAt(i) + (hash << 6) + (hash << 16) - hash;
        }

        return (hash & 0x7FFFFFFF);
    }

    /* End Of SDBM Hash Function */

    /**
     * DJB算法
     */
    public static int DJBHash(String str) {
        int hash = 5381;

        for (int i = 0; i < str.length(); i++) {
            hash = ((hash << 5) + hash) + str.charAt(i);
        }

        return (hash & 0x7FFFFFFF);
    }

    /* End Of DJB Hash Function */

    /**
     * DEK算法
     */
    public static int DEKHash(String str) {
        int hash = str.length();

        for (int i = 0; i < str.length(); i++) {
            hash = ((hash << 5) ^ (hash >> 27)) ^ str.charAt(i);
        }

        return (hash & 0x7FFFFFFF);
    }

    /* End Of DEK Hash Function */

    /**
     * AP算法
     */
    public static int APHash(String str) {
        int hash = 0;

        for (int i = 0; i < str.length(); i++) {
            hash ^= ((i & 1) == 0) ? ((hash << 7) ^ str.charAt(i) ^ (hash >> 3))
                    : (~((hash << 11) ^ str.charAt(i) ^ (hash >> 5)));
        }

        // return (hash & 0x7FFFFFFF);
        return hash;
    }

    /* End Of AP Hash Function */

    /**
     * JAVA自己带的算法
     */
    public static int java(String str) {
        int h = 0;
        int off = 0;
        int len = str.length();
        for (int i = 0; i < len; i++) {
            h = 31 * h + str.charAt(off++);
        }
        return h;
    }

    /**
     * 混合hash算法,输出64位的值
     */
    public static long mixHash(String str) {
        long hash = str.hashCode();
        hash <<= 32;
        hash |= FNVHash1(str);
        return hash;
    }
}
分享到:
评论

相关推荐

    常用的hash算法(java实现)

    本篇文章将详细讨论几种常见的哈希算法及其在Java中的实现。 1. **MD5(Message-Digest Algorithm 5)** MD5是一种广泛使用的哈希函数,产生128位(16字节)的哈希值,通常表示为32个十六进制数字。尽管MD5在安全...

    Java实现GeoHash算法

    Java实现GeoHash算法是一种在IT领域中用于地理位置数据存储和检索的技术。GeoHash将经纬度坐标转换为字符串,使得地理位置可以被高效地索引和查询。这种算法利用了空间分割和编码策略,使得相邻的位置在编码后具有...

    geohash算法实现Java代码

    在压缩包文件"geo"中,可能包含了GeoHash算法的Java实现源代码、测试用例和其他相关资源。通过分析这些代码,我们可以深入理解GeoHash算法的工作原理,并且学习如何在实际项目中应用它。 GeoHash算法的使用场景广泛...

    Hash算法大全(java实现)参照.pdf

    在Java中,实现Hash算法有多种方法,这里我们将探讨几种常见的Hash算法及其Java实现。 1. **加法Hash**: 加法Hash算法是最简单的形式,通过将字符串中的每个字符的ASCII值累加,然后取模一个质数得到哈希值。这种...

    Hash算法大全(java实现)汇编.pdf

    以下是对Java实现的各种Hash算法的详细解释: 1. **加法Hash(Additive Hash)** 这种简单的Hash算法通过将字符串中的每个字符值累加,并对一个质数取模来计算Hash值。`additiveHash`方法接受一个字符串`key`和一...

    java-Hash算法大全.doc

    Java 哈希算法大全是指在 Java 语言中实现的一系列哈希算法,目的是为了对字符串或其他数据进行哈希处理从而生成唯一的数字签名。哈希算法的应用非常广泛,如在数据库索引、数据压缩、加密解密、身份验证等领域都有...

    hash算法大全.doc

    Hash 算法大全 在计算机科学中,Hash 算法是一种将任意长度的字符串转换为固定长度的字符串的算法。Hash 算法有很多种,包括加法 Hash、旋转 Hash、一次一个 Hash、Bernstein's Hash 等。在这里,我们将详细介绍...

    高运算性能,低碰撞率的hash算法MurmurHash算法.zip

    MurmurHash算法由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc 、nginx、libmemcached,Redis,Memcached,Cassandra,HBase,Lucene等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的...

    Ketama一致性Hash算法(含Java代码) 1

    一致性哈希算法(Consistent Hashing)是一种在分布式系统中平衡数据分布的策略,尤其适用于缓存服务如Memcached或Redis。...在Java环境中,可以通过类似Spy Memcached客户端的实现方式来应用这一算法。

    MD5算法的Java实现类

    在Java中,实现MD5算法通常涉及到`java.security.MessageDigest`这个类。这个类提供了一种标准的方式来计算各种消息摘要,包括MD5。 下面我们将详细讨论MD5算法以及如何在Java中实现它。 MD5算法的核心思想是通过...

    Hash算法大全.txt

    ### Hash算法大全 #### 一、引言 Hash算法是一种将任意长度的数据转换为固定长度输出的方法,这种输出通常称为Hash值或Hash码。在计算机科学领域,Hash算法被广泛应用于数据查找、密码存储以及数据完整性校验等多...

    一致性hashjava实现

    在这个Java实现中,我们看到的是Ketama一致性哈希算法,这是一种在实践中广泛应用的一致性哈希变体。 Ketama一致性哈希算法由Last.fm的工程师开发,其设计目标是优化分布式哈希表的性能,特别是在处理大量小键值对...

    对一致性Hash算法,Java代码实现的深入研究1

    对于Java实现一致性Hash算法,有几种可能的方法: 1. **排序+List**:首先,将所有服务器节点的哈希值放入一个数组,然后使用排序算法(如归并排序、快速排序等)对数组进行排序,再将排序后的结果放入List中。之后...

    MD5加密算法的JAVA实现

    本文将深入探讨MD5算法在Java中的实现方式,包括其原理、代码实现以及应用场景。 ### MD5算法原理 MD5(Message-Digest Algorithm 5)是由Ron Rivest于1992年设计的一种散列算法,用于将任意长度的消息压缩成一个...

    hash算法工具类

    一个hash算法的工具类,里面包含了一些常用的hash算法

    最快的排序算法 javahash实现-Java-哈希算法-最快的实现,排序算法数据结构

    Java哈希算法排序算法数据结构知识点总结 以下是关于Java哈希算法排序算法数据结构的知识点总结: 1. 哈希算法的速度问题:在讨论哈希算法的速度问题时,需要考虑到哈希函数的选择和实现方式。在大多数情况下,...

    geohash算法mysql版代码

    网上有很多geohash算法的实现,都是基于java或者php代码实现的,没有sql实现的版本,这里使用mysql简单实现了这个算法

    java实现常见算法

    Java 实现常见算法 在 Java 中,实现常见算法是非常重要的,以下是关于链表、约瑟环问题、单链表反转、最大子序列和问题、最大公因数、判断两个数组中是否有相同的数字、字符串反转等知识点的总结。 判断链表是否...

    hash算法相关介绍

    ### Hash算法相关介绍 在计算机科学领域,哈希(Hash)是一种将任意长度的数据映射为固定长度数据的技术。哈希算法广泛应用于多种场景中,包括但不限于数据完整性验证、密码存储、快速查找等。本文主要介绍了几种...

    ConsistentHash:一致性hash算法的 java 和 C++ 实现

    在这个场景下,我们将深入探讨一致性哈希算法的原理、特点以及在Java和C++中的实现。 一致性哈希算法的基本思想是将哈希空间环绕成一个虚拟的圆环,每个节点都被分配到这个环上的一个或多个位置。当需要将数据映射...

Global site tag (gtag.js) - Google Analytics