charAt 三种常见hash算法

今天给各位分享charAt的知识,其中也会对三种常见hash算法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录三种常见hash算法java)char类型可以自动转化成String类型吗javascript对象有哪些三种常见hash算法hash算法有6种:1.加

今天给各位分享charAt的知识,其中也会对三种常见hash算法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录

  1. 三种常见hash算法
  2. java ) char类型可以自动转化成String类型吗
  3. javascript对象有哪些

三种常见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算法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 1553299181@qq.com 举报,一经查实,本站将立刻删除。
如若转载,请注明出处:https://www.zhuanmendingzhi.com/8486.html