公司项目需求需要把三个整型映射到一个整型中以达到减小数据传输量。传输后的数据不需要反编译出来,事实上也反编译不出来,想到了用hash算法来实现。
一: Hash原理以及限制
- Hash的主要原理就是把大范围映射到小范围;所以,你输入的实际值的个数必须和小范围相当或者比它更小。不然冲突就会非常多。
- 因为Hash逼近单向函数;所以,你能够用它来对数据进行加密。
- 不同的应用对Hash函数有着不同的要求;比方,用于加密的Hash函数主要考虑它和单项函数的差距,而用于查找的Hash函数主要考虑它映射到小范围的冲突率。
二: 常见的Hash算法已经swfit的实现
加法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达到了预期的效果,后续其他方法的hash有时间会一起补上。