import java.security.SecureRandom;
import java.util.Random; public class LongHash { private static long seed = 0xc4ceb9fe1a85ec53L;
private static Random rand = new SecureRandom(); /**
* Hash algorithm by Bob Jenkins, 1996.
*
* @param k utils on which hash is computed
* @param length utils size
* @param pc primary init value
* @param pb secondary init value
* @param is32BitHash true if just 32-bit hash is expected.
*
* @return
*/
private static long hash(byte[] k, int length, int pc, int pb, boolean is32BitHash) {
int a, b, c; a = b = c = 0xdeadbeef + length + pc;
c += pb; int offset = 0;
while (length > 12) {
a += k[offset + 0];
a += k[offset + 1] << 8;
a += k[offset + 2] << 16;
a += k[offset + 3] << 24;
b += k[offset + 4];
b += k[offset + 5] << 8;
b += k[offset + 6] << 16;
b += k[offset + 7] << 24;
c += k[offset + 8];
c += k[offset + 9] << 8;
c += k[offset + 10] << 16;
c += k[offset + 11] << 24; // mix(a, b, c);
a -= c;
a ^= rot(c, 4);
c += b;
b -= a;
b ^= rot(a, 6);
a += c;
c -= b;
c ^= rot(b, 8);
b += a;
a -= c;
a ^= rot(c, 16);
c += b;
b -= a;
b ^= rot(a, 19);
a += c;
c -= b;
c ^= rot(b, 4);
b += a; length -= 12;
offset += 12;
} switch (length) {
case 12:
c += k[offset + 11] << 24;
case 11:
c += k[offset + 10] << 16;
case 10:
c += k[offset + 9] << 8;
case 9:
c += k[offset + 8];
case 8:
b += k[offset + 7] << 24;
case 7:
b += k[offset + 6] << 16;
case 6:
b += k[offset + 5] << 8;
case 5:
b += k[offset + 4];
case 4:
a += k[offset + 3] << 24;
case 3:
a += k[offset + 2] << 16;
case 2:
a += k[offset + 1] << 8;
case 1:
a += k[offset + 0];
break;
case 0:
return is32BitHash ? c : ((((long) c) << 32)) | ((long) b &0xFFFFFFFFL);
} // Final mixing of thrree 32-bit values in to c
c ^= b;
c -= rot(b, 14);
a ^= c;
a -= rot(c, 11);
b ^= a;
b -= rot(a, 25);
c ^= b;
c -= rot(b, 16);
a ^= c;
a -= rot(c, 4);
b ^= a;
b -= rot(a, 14);
c ^= b;
c -= rot(b, 24); return is32BitHash ? c : ((((long) c) << 32)) | ((long) b &0xFFFFFFFFL);
} private static long rot(int x, int distance) {
return (x << distance) | (x >>> (32 - distance));
// return (x << distance) | (x >>> -distance);
} public static long hash(long a, long b){
byte[] buf = new byte[8*3];
long _seed = seed;
for (int i = 7; i >= 0; i--) {
buf[16 + i] = (byte)(_seed&0xFF);
_seed >>= 8;
}
for (int i = 7; i >= 0; i--) {
buf[8 + i] = (byte)(a & 0xFF);
a >>= 8;
}
for (int i = 7; i >= 0; i--) {
buf[i] = (byte)(b & 0xFF);
b >>= 8;
}
return hash(buf, buf.length, 0, 0, false) & Long.MAX_VALUE;
} public static long create() {
return rand.nextLong();
} public static void main(String[] args) {
System.out.println(hash(1, 2));
System.out.println(hash(2, 1));
System.out.println(hash(2691843745796435739L, 4372953417481662997L));
System.out.println(hash(4372953417481662997L, 2691843745796435739L));
}
}

  

简单Hash函数LongHash的更多相关文章

  1. Hash 函数及其重要性

    不时会爆出网站的服务器和数据库被盗取,考虑到这点,就要确保用户一些敏感数据(例如密码)的安全性.今天,我们要学的是 hash 背后的基础知识,以及如何用它来保护你的 web 应用的密码. 申明 密码学 ...

  2. Hash函数及其应用

    本文部分内容摘自网络,参考资料链接会在文后给出,在此感谢原作者的分享. 计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数 ...

  3. 各种字符串Hash函数比较(转)

    常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些函数使用位运算使得每一个字符都对最后的函数值产生影响.另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎 ...

  4. 理解php Hash函数,增强密码安全

    1.声明 密码学是一个复杂的话题,我也不是这方面的专家.许多高校和研究机构在这方面都有长期的研究.在这篇文章里,我希望尽量使用简单易懂的方式向你展示一种安全存储Web程序密码的方法. 2.“Hash” ...

  5. 长度有限制的字符串hash函数

    长度有限制的字符串hash函数 DJBHash是一种非常流行的算法,俗称"Times33"算法.Times33的算法很简单,就是不断的乘33,原型如下 hash(i) = hash ...

  6. [转]各种字符串Hash函数比较

    转自:https://www.byvoid.com/zht/blog/string-hash-compare 常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些 ...

  7. 学习hash_map从而了解如何写stl里面的hash函数和equal或者compare函数

    ---恢复内容开始--- 看到同事用unordered_map了所以找个帖子学习学习 http://blog.sina.com.cn/s/blog_4c98b9600100audq.html (一)为 ...

  8. 字符串hash函数

    本文搜集了一些字符串的常用hash函数. 范例1:判断两个单词是否含有相同的字母,此时我们可以用hash做.例如,“aaabb”与"aabb"含有相同的单词.(参考:http:// ...

  9. 【转】各种字符串Hash函数比较

    常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些函数使用位运算使得每一个字符都对最后的函数值产生影响.另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎 ...

随机推荐

  1. Spring XML文件配置

    singleton不能创建多对象(默认) <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...

  2. Unity对象池的实现

    对象池是一个单例类: using System.Collections; using System.Collections.Generic; using UnityEngine; public cla ...

  3. ZIP、tar.gz压缩时排除指定目录

    1.ZIP 压缩时排除一个文件夹下所有内容zip -r sss.zip sss/ -x "sss/222/*" 压缩时排除指定多个文件夹下所有内容zip -r sss.zip ss ...

  4. String formate的语法解析及简单用法

    转自:https://blog.csdn.net/jiangyu1013/article/details/52607257 package cn.wuxiangbin.StringFormat; im ...

  5. ccf-路径解析201604-3

    C++没有split函数 但是有一个简单的方法,利用stringstream构建; 然后这道题就很简单啦 还要注意不能用cin 因为有空行的存在 #include <bits/stdc++.h& ...

  6. DEA快速生成get&set方法

    将下图UserInfo类中的几个对象全部生成 get/set方法: 方法步骤: 1.   将光放置空白区域,按 [alt + (fn+insert)] ,或 [ alt + insert] 键! 2. ...

  7. 使用Websocket与服务器建立连接

    handleMessage = () => { const url = '////'; //某url const token = getCookie('xnToken');//向后端发请求得登陆 ...

  8. cordova原生页面切换效果插件的使用:com.telerik.plugins.nativepagetransitions

    1. 添加插件:cordova plugin add com.telerik.plugins.nativepagetransitions2. 使用方法: 在index.html中添加: <met ...

  9. Custom Default Node Colors and Shapes in Houdini 16.5

    A:before H16.5: 1.Create a file, named OPcustomize 2.Edit it like this: //Custom Default Shapes opde ...

  10. 关于WeakEventManger的引用

    在引用WeakEventManger时,代码里添加的命名空间是System.Windows,但项目引用的却是WindowsBase,真奇葩.