简单Hash函数LongHash
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的更多相关文章
- Hash 函数及其重要性
不时会爆出网站的服务器和数据库被盗取,考虑到这点,就要确保用户一些敏感数据(例如密码)的安全性.今天,我们要学的是 hash 背后的基础知识,以及如何用它来保护你的 web 应用的密码. 申明 密码学 ...
- Hash函数及其应用
本文部分内容摘自网络,参考资料链接会在文后给出,在此感谢原作者的分享. 计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数 ...
- 各种字符串Hash函数比较(转)
常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些函数使用位运算使得每一个字符都对最后的函数值产生影响.另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎 ...
- 理解php Hash函数,增强密码安全
1.声明 密码学是一个复杂的话题,我也不是这方面的专家.许多高校和研究机构在这方面都有长期的研究.在这篇文章里,我希望尽量使用简单易懂的方式向你展示一种安全存储Web程序密码的方法. 2.“Hash” ...
- 长度有限制的字符串hash函数
长度有限制的字符串hash函数 DJBHash是一种非常流行的算法,俗称"Times33"算法.Times33的算法很简单,就是不断的乘33,原型如下 hash(i) = hash ...
- [转]各种字符串Hash函数比较
转自:https://www.byvoid.com/zht/blog/string-hash-compare 常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些 ...
- 学习hash_map从而了解如何写stl里面的hash函数和equal或者compare函数
---恢复内容开始--- 看到同事用unordered_map了所以找个帖子学习学习 http://blog.sina.com.cn/s/blog_4c98b9600100audq.html (一)为 ...
- 字符串hash函数
本文搜集了一些字符串的常用hash函数. 范例1:判断两个单词是否含有相同的字母,此时我们可以用hash做.例如,“aaabb”与"aabb"含有相同的单词.(参考:http:// ...
- 【转】各种字符串Hash函数比较
常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些函数使用位运算使得每一个字符都对最后的函数值产生影响.另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎 ...
随机推荐
- Linux下Apache的安装【可用】
失败的情况有很多种,但成功的路有时候只有一条.在经历了多次失败安装后,特在此将apache安装的精简步骤罗列出来供日后参考. ====================APACHE 安装方法====== ...
- 获取choice的value
- 云原生GIS技术
云原生架构概述 - DockOne.io http://dockone.io/article/2991 云原生GIS技术全解读 - SuperMap技术控 - CSDN博客 https://blo ...
- 转 Postman访问Webapi的Get/Post/Put/Delte请求
Postman访问Webapi的Get/Post/Put/Delte请求 2018年07月26日 15:04:46 DoNotWorkOvertime 阅读数:348 标签: WebApiPostma ...
- call,apply,bind 方法的学习
这是三个常用的操作函数的方法,在js中函数就是一等公民,所以说掌握这三个方法还是有必要的 call 和 apply,都会绑定函数的上下文(context)并立即执行调用该方法函数,两者区别在于,接受的 ...
- snprintf笔记
在weibo上看到Laruence大神修复了一个使用snprintf的bug (http://t.cn/Rm6AuFh) 引起了TK教主的关注.TK教主着重提到了在windows下snprintf与_ ...
- leetcode 687.Longest Univalue Path
寻找最长的路径,那么会在左边或者右边或者是从左到跟然后再到右方的路径的. /** * Definition for a binary tree node. * struct TreeNode { * ...
- 陈斌python语言基础与应用00
软件改变生活:购物.餐饮.商旅出行.资料查找... Everybody in this country should learn how to program a computer...because ...
- SpringBoot框架中,使用过滤器进行加密解密操作(一)
一.基本说明 1.请求方式:POST请求.注解@PostMapping 2.入参格式:json串 3.出参格式:json串(整体加密) 4.使用Base64进行加密解密.具体的加密方式,可以根据需求自 ...
- Floyd(求每2个点之间的最短路)
稍微改变即可求传递闭包,即关心两点之间是否有同路: for(int i=0;i<n;i++) for(int j=0;j<n;j++){ if(i==j) d[i][i]=0; else ...