遊戲中要去校正使用者名稱是否重複,redis中放中文的key貌似蠻怪的吧,還是hash後放數字吧,從而校正是否衝突;
hash衝突 例如“Af”和“BG”雜湊值相同,則有“AfAf”,“AfBG”,“BGAf”,“BGBG”的雜湊值也相同
具體關於java的Hash衝突攻擊 可以參考此文章:http://keary.cn/?p=845
不廢話了,實際雙hash用途很多,還有就是java中的內建hash會出現負數比如 (-8%3) 就為-2 依賴模數後的值就會出問題;
上代碼:
package com.leeyz.idea.test;
public class TestHash {
public static void main(String[] args) {
String str = "中文";
System.out.println(str.hashCode());
System.out.println("s".hashCode());
System.out.println("S".hashCode());
System.out.println("cat".hashCode());
System.out.println("Af".hashCode());
System.out.println("BG".hashCode());
System.out.println(FNVHash1Uint("Af"));
System.out.println(FNVHash1Uint("BG"));
System.out.println(mixHashULong("Af"));
System.out.println(mixHashULong("BG"));
System.out.println(-8%3);
}
public static long mixHashULong(String str) {
long hash = (str.hashCode() & 0x7fffffff) * 1L;
hash <<= 32;
hash |= FNVHash1Uint(str);
return hash;
}
public static int FNVHash1Uint(String str) {
byte[] data = str.getBytes();
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 & 0x7fffffff);
}
}