公司項目需求需要把三個整型映射到一個整型中以達到減小數(shù)據(jù)傳輸量骇塘。傳輸后的數(shù)據(jù)不需要反編譯出來蕉朵,事實上也反編譯不出來柠座,想到了用hash算法來實現(xiàn)。
一: Hash原理以及限制
- Hash的主要原理就是把大范圍映射到小范圍;所以疼电,你輸入的實際值的個數(shù)必須和小范圍相當或者比它更小院喜。不然沖突就會非常多爷辱。
- 因為Hash逼近單向函數(shù)既鞠;所以煤傍,你能夠用它來對數(shù)據(jù)進行加密。
- 不同的應用對Hash函數(shù)有著不同的要求损趋;比方患久,用于加密的Hash函數(shù)主要考慮它和單項函數(shù)的差距椅寺,而用于查找的Hash函數(shù)主要考慮它映射到小范圍的沖突率浑槽。
二: 常見的Hash算法已經(jīng)swfit的實現(xiàn)
加法Hash
位運算Hash
extension String {
func stringHash() -> Int {
var hash:Int64 = 0;
var x:Int64 = 0;
for i in 0 ..< self.characters.count {
hash = (hash << 4 ) + Int64((self as NSString).character(at:i));
let x = hash & Int64.init(0xF0000000)
if x != 0 {
hash ^= (x >> 24);
hash &= ~x;
}
}
hash = (hash & Int64.init(0x7FFFFFFF))
hash = hash % 2147483647
return Int(hash);
}
}
- 乘法Hash
- 除法Hash
- 查表Hash
- 混合Hash
這里選用了位移hash達到了預期的效果,后續(xù)其他方法的hash有時間會一起補上返帕。