南阳网站公司,sae wordpress 安装插件,app下载安装官方版,wordpress 私活一、hash算法哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值#xff0c;这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母#xff0c;随后的哈希都将产生不同的值。要找到散列为同…一、hash算法哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入在计算上是不可能的所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。二、对象hash总结
Integer、Byte、Short、Character都是转换为int类型作为hashcode
Boolean true值hashcode为1231false值hashcode为1237
Long 取高32位和低32位与值转成int类型作为hashcode
Double 将64bit值转成long类型然后按照Long类型进行获取hashcode
Float 将32bit值转成int类型检查int值是否来自NAN值转换的若是hashcode为0x7fc00000否则为该转换值。
String 将字符串里面的字符以31进制求和既hashhash*31value[i]
Object 以内存首字节的地址进行计算hash值
HashMap 将所有Entry的hashcode相加组成HashMap的hashcode
Hashtable EntrySet长度0或者加载因子小于0时hashcode为0否则将所有key的hashcode相加组成HashMap的hashcode三、jdk的hash算法实现
1Intergerprivate final int value;
Overridepublic int hashCode() {return Integer.hashCode(value);}
public static int hashCode(int value) {return value;}Integer的hash算法就是直接获取它的数值。int整数范围很大分散广冲突小。2Shortprivate final short value;Overridepublic int hashCode() {return Short.hashCode(value);}public static int hashCode(short value) {return (int)value;}3Byteprivate final byte value;Overridepublic int hashCode() {return Byte.hashCode(value);}public static int hashCode(byte value) {return (int)value;}4Longprivate final long value;Overridepublic int hashCode() {return Long.hashCode(value);}public static int hashCode(long value) {return (int)(value ^ (value 32));}long类型作为索引范围太大需要转为int类型。这里简单的获取低32位容易导致散列不均因为高位部分没有被利用。所以这里采用逻辑右移32位让高32位和低32位进行XOR操作导致高位低位都能被利用到5Doubleprivate final double value;Overridepublic int hashCode() {return Double.hashCode(value);}public static int hashCode(double value) {long bits doubleToLongBits(value);return (int)(bits ^ (bits 32));}由于double不能当成索引所以需要转换成整数
由于double数据类型底层采用64位bit码表示采用IEEE浮点标准编码。如果将它使用8字节整数编码方式就能获取一个long类型的数字
long类型作为索引范围太大需要转为int类型。这里简单的获取低32位容易导致散列不均因为高位部分没有被利用。所以这里采用逻辑右移32位让高32位和低32位进行XOR操作导致高位低位都能被利用到
最后得到的数字强转int只保留已经被充分打乱的低32位6Floatprivate final float value;Overridepublic int hashCode() {return Float.hashCode(value);}public static int hashCode(float value) {return floatToIntBits(value);}public static int floatToIntBits(float value) {int result floatToRawIntBits(value);// Check for NaN based on values of bit fields, maximum// exponent and nonzero significand.if ( ((result FloatConsts.EXP_BIT_MASK) FloatConsts.EXP_BIT_MASK) (result FloatConsts.SIGNIF_BIT_MASK) ! 0)result 0x7fc00000;return result;}public static native int floatToRawIntBits(float value);public class FloatConsts {public static final int EXP_BIT_MASK 2139095040;public static final int SIGNIF_BIT_MASK 8388607;//...
}7Booleanprivate final boolean value;Overridepublic int hashCode() {return Boolean.hashCode(value);}public static int hashCode(boolean value) {return value ? 1231 : 1237;}采用两个质数作为true或false的索引。这两个质数足够大用来作为索引时出现碰撞的可能性低。8Characterprivate final char value;Overridepublic int hashCode() {return Character.hashCode(value);}public static int hashCode(char value) {return (int)value;}9Stringprivate final char value[];public int hashCode() {int h hash;if (h 0 value.length 0) {char val[] value;for (int i 0; i value.length; i) {h 31 * h val[i];}hash h;}return h;}采用质数31作为基数逐位加权打乱整个字符的权重和排列位置使得散列效果更好。10Objectpublic native int hashCode();11自定义对象
public class NodeT {private T data;private NodeT next null;Overridepublic int hashCode() {int hash 3;hash 97 * hash Objects.hashCode(this.data);hash 97 * hash Objects.hashCode(this.next);return hash;}
}public final class Objects {public static int hashCode(Object o) {return o ! null ? o.hashCode() : 0;}//...
}12HashMapstatic final int hash(Object key) {int h;return (key null) ? 0 : (h key.hashCode()) ^ (h 16);}public int hashCode() {int h 0;IteratorEntryK,V i entrySet().iterator();while (i.hasNext())h i.next().hashCode();return h;}13Hashtablepublic synchronized V put(K key, V value) {// Make sure the value is not nullif (value null) {throw new NullPointerException();}// Makes sure the key is not already in the hashtable.Entry?,? tab[] table;int hash key.hashCode();int index (hash 0x7FFFFFFF) % tab.length;SuppressWarnings(unchecked)EntryK,V entry (EntryK,V)tab[index];for(; entry ! null ; entry entry.next) {if ((entry.hash hash) entry.key.equals(key)) {V old entry.value;entry.value value;return old;}}addEntry(hash, key, value, index);return null;}public synchronized int hashCode() {int h 0;if (count 0 || loadFactor 0)return h; // Returns zero
loadFactor -loadFactor; // Mark hashCode computation in progressEntry?,?[] tab table;for (Entry?,? entry : tab) {while (entry ! null) {h entry.hashCode();entry entry.next;}}loadFactor -loadFactor; // Mark hashCode computation completereturn h;}