今天给各位分享charAt的知识,其中也会对三种常见hash算法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录三种常见hash算法java)char类型可以自动转化成String类型吗javascript对象有哪些三种常见hash算法hash算法有6种:1.加
今天给各位分享charAt的知识,其中也会对三种常见hash算法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录
三种常见hash算法
hash算法有6种:
1.加法Hash;
2.位运算Hash;
3.乘法Hash;
4.除法Hash;
5.查表Hash;
6.混合Hash。实际中的Hash函数是指把一个大范围映射到一个小范围。把大范围映射到一个小范围的目的往往是为了节省空间,使得数据容易保存。除此以外,Hash函数往往应用于查找上。
?
一、加法Hash
所谓的加法Hash就是把输入元素一个一个的加起来构成最后的结果。标准的加法Hash的构造如下:
staticintadditiveHash(Stringkey,intprime)
{undefined
inthash,i;
for(hash=key.length(),i=0;i<key.length();i++)
hash+=key.charAt(i);
return(hash%prime);
}
这里的prime是任意的质数,看得出,结果的值域为[0,prime-1]。
二、位运算Hash
这类型Hash函数通过利用各种位运算(常见的是移位和异或)来充分的混合输入元素。比如,标准的旋转Hash的构造如下:
staticintrotatingHash(Stringkey,intprime)
{undefined
inthash,i;
for(hash=key.length(),i=0;i<key.length();++i)
hash=(hash<<4)^(hash>>28)^key.charAt(i);
return(hash%prime);
}
先移位,然后再进行各种位运算是这种类型Hash函数的主要特点。比如,以上的那段计算hash的代码还可以有如下几种变形:
hash=(hash<<5)^(hash>>27)^key.charAt(i);
hash+=key.charAt(i);
hash+=(hash<<10);
hash^=(hash>>6);
if((i&1)==0)
{undefined
hash^=(hash<<7)^key.charAt(i)^(hash>>3);
}
else
{undefined
hash^=~((hash<<11)^key.charAt(i)^(hash>>5));
}
hash+=(hash<<5)+key.charAt(i);
hash=key.charAt(i)+(hash<<6)+(hash>>16)–hash;
hash^=((hash<<5)+key.charAt(i)+(hash>>2));
三、乘法Hash
这种类型的Hash函数利用了乘法的不相关性(乘法的这种性质,最有名的莫过于平方取头尾的随机数生成算法,虽然这种算法效果并不好)。比如,
staticintbernstein(Stringkey)
{undefined
inthash=0;
inti;
for(i=0;i<key.length();++i)hash=33*hash+key.charAt(i);
returnhash;
}
jdk5.0里面的String类的hashCode()方法也使用乘法Hash。不过,它使用的乘数是31。推荐的乘数还有:131,1313,13131,131313等等。
使用这种方式的著名Hash函数还有:
//32位FNV算法
intM_SHIFT=0;
publicintFNVHash(byte[]data)
{undefined
inthash=(int)2166136261L;
for(byteb:data)
hash=(hash*16777619)^b;
if(M_SHIFT==0)
returnhash;
return(hash^(hash>>M_SHIFT))&M_MASK;
}
以及改进的FNV算法:
publicstaticintFNVHash1(Stringdata)
{undefined
finalintp=16777619;
inthash=(int)2166136261L;
for(inti=0;i<data.length();i++)
hash=(hash^data.charAt(i))*p;
hash+=hash<<13;
hash^=hash>>7;
hash+=hash<<3;
hash^=hash>>17;
hash+=hash<<5;
returnhash;
}
除了乘以一个固定的数,常见的还有乘以一个不断改变的数,比如:
staticintRSHash(Stringstr)
{undefined
intb=378551;
inta=63689;
inthash=0;
for(inti=0;i<str.length();i++)
{undefined
hash=hash*a+str.charAt(i);
a=a*b;
}
return(hash&0x7FFFFFFF);
}
虽然Adler32算法的应用没有CRC32广泛,不过,它可能是乘法Hash里面最有名的一个了。关于它的介绍,大家可以去看RFC1950规范。
四、除法Hash
除法和乘法一样,同样具有表面上看起来的不相关性。不过,因为除法太慢,这种方式几乎找不到真正的应用。需要注意的是,我们在前面看到的hash的结果除以一个prime的目的只是为了保证结果的范围。如果你不需要它限制一个范围的话,可以使用如下的代码替代”hash%prime”:hash=hash^(hash>>10)^(hash>>20)。
五、查表Hash
查表Hash最有名的例子莫过于CRC系列算法。虽然CRC系列算法本身并不是查表,但是,查表是它的一种最快的实现方式。查表Hash中有名的例子有:UniversalHashing和ZobristHashing。他们的表格都是随机生成的。
六、混合Hash
混合Hash算法利用了以上各种方式。各种常见的Hash算法,比如MD5、Tiger都属于这个范围。它们一般很少在面向查找的Hash函数里面使用。
java ) char类型可以自动转化成String类型吗
将char转换为String大致有6种方法。总结如下:
1、Strings=String.valueOf(‘c’);//效率最高的方法2、Strings=String.valueOf(newchar[]{‘c’});//将一个char数组转换成String3、Strings=Character.toString(‘c’);//Character.toString(char)方法实际上直接返回String.valueOf(char)4、Strings=newCharacter(‘c’).toString();5、Strings=””+’c’;//虽然这个方法很简单,但这是效率最低的方法;扩展资料:String转换为char:在Java中将String转换为char是非常简单的。1、使用String.charAt(index)(返回值为char)可以得到String中某一指定位置的char。
2、使用String.toCharArray()(返回值为char[])可以得到将包含整个String的char数组。这样我们就能够使用从0开始的位置索引来访问string中的任意位置的元素。
javascript对象有哪些
JavaScript中的所有事物都是对象,如:字符串、数值、数组、函数等,每个对象带有属性和方法。
对象的属性:反映该对象某些特定的性质的,如:字符串的长度、图像的长宽等;
对象的方法:能够在对象上执行的动作。例如,表单的“提交”(Submit),时间的“获取”(getYear)等;
JavaScript提供多个内建对象,比如String、Date、Array等等,使用对象前先定义
下面举例一些
Array对象中常用方法:
Concat():表示把几个数组合并成一个数组。
Join():返回字符串值,其中包含了连接到一起的数组的所有元素,元素由指定的分隔符分隔开来。
Pop():移除数组最后一个元素。
Shift():移除数组中第一个元素。
Slice(start,end):返回数组中的一段。
Push():往数组中新添加一个元素,返回最新长度。
Sort():对数组进行排序。
Reverse():反转数组的排序。
toLocaleString();返回当前系统时间
Array对象属性常用的只有一个:
Length:表示取得当前数组长度
Global对象
是一个固有对象,目的是把所有的全局方法集中在一个对象中。
Global没有语法,直接调用其方法。
escape():对String对象编码以便它们能在所有计算机上可读.
escape(charString)
必选项charstring参数是要编码的任意String对象或文字。
isNaN():判断一个值是否是NaN。
parseInt():返回由字符串得到的整数
正则表达式对象
本对象包含正则表达式模式以及表明如何应用模式的标志。
语法1
re=/pattern/[flags]
语法2
re=newRegExp(“pattern”,[“flags”])
re为将要赋值正则表达式模式的变量名
pattern为正则表达式
flags为标记:有如下3中
1:g(全文查找)
2:i(忽略大小写)
3:m(多行查找)
当预先知道查找字符串时用语法1。当查找字符串经常变动或不知道时用语法2,比如由用户输入得到的字符串。
String对象
charAt():返回指定索引的位置的字符
concat():返回字符串值,表示两个或多个字符串的连接
match():使用正则表达式模式对字符串执行查找,并将包含查找结果最为结果返回
functionMatchDemo(){
varr,re;//声明变量。
vars=”TheraininSpainfallsmainlyintheplain”;
re=/ain/i;//创建正则表达式模式。
r=s.match(re);//尝试匹配搜索字符串。
return(r);//返回第一次出现”ain”的地方。
}
Replace(a,b):字符b替换a
Search(stringObject):指明是否存在相应的匹配。如果找到一个匹配,search方法将返回一个整数值,指明这个匹配距离字符串开始的偏移位置。如果没有找到匹配,则返回-1。
Slice(start,end):返回字符段片段
Split():字符串拆分
Substr(start,length):字符串截取
Substring(start,end)取得指定长度内的字符串
toUpperCase():返回一个字符串,该字符串中的所有字母都被转化为大写字母。
toLowerCase():返回一个字符串,该字符串中的所有字母都被转化为小写字母。
Math对象
ceil():向上取整。
floor():向下取整。
round():四舍五入。
random():取随机数。
Date对象
get/setDate():返回或设置日期。
get/setFullYear():返回或设置年份,用四位数表示。
get/setYear():返回或设置年份。
get/setMonth():返回或设置月份。0为一月
get/setHours():返回或设置小时,24小时制
get/setMinutes():返回或设置分钟数。
get/setSeconds():返回或设置秒钟数。
get/setTime():返回或设置时间(毫秒为单位)
关于charAt和三种常见hash算法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
如若转载,请注明出处:https://www.zhuanmendingzhi.com/8486.html