pho*_*nix 12 java hash-function
我在采访中遇到过需要对整数或字符串使用哈希函数的情况.在这种情况下我们应该选择哪一种?我在这些情况下错了,因为我最终选择了产生大量碰撞的那些,但是哈希函数往往是数学的,你不能在面试中回忆起它们.是否有任何一般性建议,以至于面试官对整数或字符串输入的方法感到满意?在"面试情境"中,哪些功能对于两个输入都是足够的
以下是Effective java第33页的简单配方:
你应该问面试官哈希函数是什么 - 这个问题的答案将决定什么样的哈希函数是合适的.
如果它用于散列数据结构(如散列映射),则希望它尽可能简单(快速执行)并避免冲突(大多数常见值映射到不同的散列值).一个很好的例子是对同一个整数进行整数散列 - 这是java.lang.Integer中的标准hashCode()实现
如果出于安全考虑,您将需要使用加密哈希函数.这些主要是为了很难反转哈希函数或发现冲突.
如果你想要快速伪随机哈希值(例如用于模拟),那么你通常可以修改伪随机数生成器来创建它们.我个人最喜欢的是:
Run Code Online (Sandbox Code Playgroud)public static final int hash(int a) { a ^= (a << 13); a ^= (a >>> 17); a ^= (a << 5); return a; }
如果要为某种形式的复合结构计算散列(例如,具有多个字符的字符串,或数组,或具有多个字段的对象),则可以使用各种技术来创建组合散列函数.我建议对组成部分的旋转散列值进行异或,例如:
public static <T> int hashCode(T[] data) {
int result=0;
for(int i=0; i<data.length; i++) {
result^=data[i].hashCode();
result=Integer.rotateRight(result, 1);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
请注意,上述内容不具有加密安全性,但可用于大多数其他目的.您显然会遇到冲突,但是当将大型结构散列为整数时,这是不可避免的:-)
| 归档时间: |
|
| 查看次数: |
11255 次 |
| 最近记录: |