python string函数中string的hash函数为什么选择这个

hackfreer 的BLOG
用户名:hackfreer
文章数:532
评论数:210
访问量:1230305
注册日期:
阅读量:5863
阅读量:12276
阅读量:380876
阅读量:1073043
51CTO推荐博文
在python有各种各样的string操作函数。在历史上string类在python中经历了一段轮回的历史。在最开始的时候,python有一个专门的string的module,要使用string的方法要先import,但后来由于众多的python使用者的建议,从python2.0开始, string方法改为用S.method()的形式调用,只要S是一个字符串对象就可以这样使用,而不用import。同时为了保持向后兼容,现在的 python中仍然保留了一个string的module,其中定义的方法与S.method()是相同的,这些方法都最后都指向了用S.method ()调用的函数。要注意,S.method()能调用的方法比string的module中的多,比如isdigit()、istitle()等就只能用 S.method()的方式调用。
对一个字符串对象,首先想到的操作可能就是计算它有多少个字符组成,很容易想到用S.len(),但这是错的,应该是len(S)。因为len()是内置函数,包括在__builtin__模块中。python不把len()包含在string类型中,乍看起来好像有点不可理解,其实一切有其合理的逻辑在里头。len()不仅可以计算字符串中的字符数,还可以计算list的成员数,tuple的成员数等等,因此单单把len()算在string里是不合适,因此一是可以把len()作为通用函数,用重载实现对不同类型的操作,还有就是可以在每种有len()运算的类型中都要包含一个len()函数。 python选择的是第一种解决办法。类似的还有str(arg)函数,它把arg用string类型表示出来。
字符串中字符大小写的变换:
S.lower() #小写
S.upper() #大写
S.swapcase() #大小写互换
S.capitalize() #首字母大写
String.capwords(S)
#这是模块中的方法。它把S用split()函数分开,然后用capitalize()把首字母变成大写,最后用join()合并到一起
S.title() #只有首字母大写,其余为小写,模块中没有这个方法
字符串在输出时的对齐:
S.ljust(width,[fillchar])
#输出width个字符,S左对齐,不足部分用fillchar填充,默认的为空格。
S.rjust(width,[fillchar]) #右对齐
S.center(width, [fillchar]) #中间对齐
S.zfill(width) #把S变成width长,并在右对齐,不足部分用0补足
字符串中的搜索和替换:
S.find(substr, [start, [end]])
#返回S中出现substr的第一个字母的标号,如果S中没有substr则返回-1。start和end作用就相当于在S[start:end]中搜索
S.index(substr, [start, [end]])
#与find()相同,只是在S中没有substr时,会返回一个运行时错误
S.rfind(substr, [start, [end]])
#返回S中最后出现的substr的第一个字母的标号,如果S中没有substr则返回-1,也就是说从右边算起的第一次出现的substr的首字母标号
S.rindex(substr, [start, [end]])
S.count(substr, [start, [end]]) #计算substr在S中出现的次数
S.replace(oldstr, newstr, [count])
#把S中的oldstar替换为newstr,count为替换次数。这是替换的通用形式,还有一些函数进行特殊字符的替换
S.strip([chars])
#把S中前后chars中有的字符全部去掉,可以理解为把S前后chars替换为None
S.lstrip([chars])
S.rstrip([chars])
S.expandtabs([tabsize])
#把S中的tab字符替换没空格,每个tab替换为tabsize个空格,默认是8个
字符串的分割和组合:
S.split([sep, [maxsplit]])
#以sep为分隔符,把S分成一个list。maxsplit表示分割的次数。默认的分割符为空白字符
S.rsplit([sep, [maxsplit]])
S.splitlines([keepends])
#把S按照行分割符分为一个list,keepends是一个bool值,如果为真每行后而会保留行分割符。
S.join(seq) #把seq代表的序列──字符串序列,用S连接起来
字符串的mapping,这一功能包含两个函数:
String.maketrans(from, to)
#返回一个256个字符组成的翻译表,其中from中的字符被一一对应地转换成to,所以from和to必须是等长的。
S.translate(table[,deletechars])
# 使用上面的函数产后的翻译表,把S进行翻译,并把deletechars中有的字符删掉。需要注意的是,如果S为unicode字符串,那么就不支持 deletechars参数,可以使用把某个字符翻译为None的方式实现相同的功能。此外还可以使用codecs模块的功能来创建更加功能强大的翻译表。
字符串还有一对编码和解码的函数:
S.encode([encoding,[errors]])
# 其中encoding可以有多种值,比如gb2312 gbk gb18030 bz2 zlib big5 bzse64等都支持。errors默认值为&strict&,意思是UnicodeError。可能的值还有'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 和所有的通过codecs.register_error注册的值。这一部分内容涉及codecs模块,不是特明白
S.decode([encoding,[errors]])
字符串的测试函数,这一类函数在string模块中没有,这些函数返回的都是bool值:
S.startwith(prefix[,start[,end]])
#是否以prefix开头
S.endwith(suffix[,start[,end]])
#以suffix结尾
S.isalnum()
#是否全是字母和数字,并至少有一个字符
S.isalpha() #是否全是字母,并至少有一个字符
S.isdigit() #是否全是数字,并至少有一个字符
S.isspace() #是否全是空白字符,并至少有一个字符
S.islower() #S中的字母是否全是小写
S.isupper() #S中的字母是否便是大写
S.istitle() #S是否是首字母大写的
字符串类型转换函数,这几个函数只在string模块中有:
string.atoi(s[,base])
#base默认为10,如果为0,那么s就可以是012或0x23这种形式的字符串,如果是16那么s就只能是0x23或0X12这种形式的字符串
string.atol(s[,base]) #转成long
string.atof(s[,base]) #转成float
这里再强调一次,字符串对象是不可改变的,也就是说在python创建一个字符串后,你不能把这个字符中的某一部分改变。任何上面的函数改变了字符串后,都会返回一个新的字符串,原字串并没有变。其实这也是有变通的办法的,可以用S=list(S)这个函数把S变为由单个字符为成员的list,这样的话就可以使用S[3]='a'的方式改变值,然后再使用S=& &.join(S)还原成字符串
了这篇文章
类别:┆阅读(0)┆评论(0)字符串Hash函数的比较 - lonelycatcher - 博客园
if only as first....
常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法。这些函数使用位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎不可能找到碰撞。
常用字符串哈希函数有 BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等。对于以上几种哈希函数,我对其进行了一个小小的评测。
其中数据1为100000个字母和数字组成的随机串哈希冲突个数。数据2为100000个有意义的英文句子哈希冲突个数。数据3为数据1的哈希值与 1000003(大素数)求模后存储到线性表中冲突的个数。数据4为数据1的哈希值与(更大素数)求模后存储到线性表中冲突的个数。
经过比较,得出以上平均得分。平均数为平方平均数。可以发现,BKDRHash无论是在实际效果还是编码实现中,效果都是最突出的。APHash也是较为优秀的算法。DJBHash,JSHash,RSHash与SDBMHash各有千秋。PJWHash与ELFHash效果最差,但得分相似,其算法本质是相似的。
unsigned int SDBMHash(char *str){
unsigned int hash = 0;
while (*str)
// equivalent to: hash = 65599*hash + (*str++);
hash = (*str++) + (hash && 6) + (hash && 16) -
return (hash & 0x7FFFFFFF);} // RS Hash Functionunsigned int RSHash(char *str){
unsigned int b = 378551;
unsigned int a = 63689;
unsigned int hash = 0;
while (*str)
hash = hash * a + (*str++);
return (hash & 0x7FFFFFFF);} // JS Hash Functionunsigned int JSHash(char *str){
unsigned int hash = ;
while (*str)
hash ^= ((hash && 5) + (*str++) + (hash && 2));
return (hash & 0x7FFFFFFF);} // P. J. Weinberger Hash Functionunsigned int PJWHash(char *str){
unsigned int BitsInUnignedInt = (unsigned int)(sizeof(unsigned int) * 8);
unsigned int ThreeQuarters
= (unsigned int)((BitsInUnignedInt
* 3) / 4);
unsigned int OneEighth
= (unsigned int)(BitsInUnignedInt / 8);
unsigned int HighBits
= (unsigned int)(0xFFFFFFFF) && (BitsInUnignedInt - OneEighth);
unsigned int hash
unsigned int test
while (*str)
hash = (hash && OneEighth) + (*str++);
if ((test = hash & HighBits) != 0)
hash = ((hash ^ (test && ThreeQuarters)) & (~HighBits));
return (hash & 0x7FFFFFFF);} // ELF Hash Functionunsigned int ELFHash(char *str){
unsigned int hash = 0;
unsigned int x
while (*str)
hash = (hash && 4) + (*str++);
if ((x = hash & 0xF0000000L) != 0)
hash ^= (x && 24);
hash &= ~x;
return (hash & 0x7FFFFFFF);} // BKDR Hash Functionunsigned int BKDRHash(char *str){
unsigned int seed = 131; // 31 131
131313 etc..
unsigned int hash = 0;
while (*str)
hash = hash * seed + (*str++);
return (hash & 0x7FFFFFFF);} // DJB Hash Functionunsigned int DJBHash(char *str){
unsigned int hash = 5381;
while (*str)
hash += (hash && 5) + (*str++);
return (hash & 0x7FFFFFFF);} // AP Hash Functionunsigned int APHash(char *str){
unsigned int hash = 0;
for (i=0; * i++)
if ((i & 1) == 0)
hash ^= ((hash && 7) ^ (*str++) ^ (hash && 3));
hash ^= (~((hash && 11) ^ (*str++) ^ (hash && 5)));
return (hash & 0x7FFFFFFF);}
随笔 - 123生成字符串变量str='python String function'&字符串长度获取:len(str)例:print '%s length=%d' % (str,len(str))连接字符串sStr1 = 'strcat'sStr2 = 'append'sStr1 += sStr2print sStr1复制字符串#strcpy(sStr1,sStr2)sStr1 = 'strcpy'sStr2 = sStr1sStr1 = 'strcpy2'print sStr2比较字符串#strcmp(sStr1,sStr2)sStr1 = 'strchr'sStr2 = 'strch'print cmp(sStr1,sStr2)
#注意cmp函数的输出结果和C语言的strcmp是一样的。还可以用 &aaa&==&bbb& 来比较字符串。截取字符串
特别注意:下标从0开始;str[0:3]不包含下标为3的字符。str = &&print str[0:3] #截取第一位到第三位的字符print str[:] #截取字符串的全部字符print str[6:] #截取第七个字符到结尾print str[:-3] #截取从头开始到倒数第三个字符之前print str[2] #截取第三个字符print str[-1] #截取倒数第一个字符print str[::-1] #创造一个与原字符串顺序相反的字符串print str[-3:-1] #截取倒数第三位与倒数第一位之前的字符print str[-3:] #截取倒数第三位到结尾print str[:-5:-3] #逆序截取,具体啥意思没搞明白?
字符串中的搜索和替换:S.find(substr, [start, [end]])&& #返回S中出现substr的第一个字母的标号,如果S中没有substr则返回-1。start和end作用就相当于在S[start:end]中搜索 S.index(substr, [start, [end]])&& #与find()相同,只是在S中没有substr时,会返回一个运行时错误 S.rfind(substr, [start, [end]])&& #返回S中最后出现的substr的第一个字母的标号,如果S中没有substr则返回-1,也就是说从右边算起的第一次出现的substr的首字母标号 S.rindex(substr, [start, [end]]) S.count(substr, [start, [end]])&&& #计算substr在S中出现的次数 S.replace(oldstr, newstr, [count])&&& #把S中的oldstr替换为newstr,count为替换次数。这是替换的通用形式,还有一些函数进行特殊字符的替换 S.strip([chars]) #把S中前后chars中有的字符全部去掉,可以理解为把S前后chars替换为None S.lstrip([chars]) S.rstrip([chars]) S.expandtabs([tabsize])&& #把S中的tab字符替换没空格,每个tab替换为tabsize个空格,默认是8个
字符串的分割和组合:S.split([sep, [maxsplit]]) #以sep为分隔符,把S分成一个list。maxsplit表示分割的次数。默认的分割符为空白字符 S.rsplit([sep, [maxsplit]]) S.splitlines([keepends]) #把S按照行分割符分为一个list,keepends是一个bool值,如果为真每行后而会保留行分割符。 S.join(seq) #把seq代表的序列──字符串序列,用S连接起来字符串的mapping,这一功能包含两个函数:String.maketrans(from, to) #返回一个256个字符组成的翻译表,其中from中的字符被一一对应地转换成to,所以from和to必须是等长的。 S.translate(table[,deletechars])
使用上面的函数产后的翻译表,把S进行翻译,并把deletechars中有的字符删掉。需要注意的是,如果S为unicode字符串,那么就不支持
deletechars参数,可以使用把某个字符翻译为None的方式实现相同的功能。此外还可以使用codecs模块的功能来创建更加功能强大的翻译
字符串中字符大小写的变换:S.lower()&& #小写 S.upper()&& #大写 S.swapcase()&& #大小写互换 S.capitalize()&& #首字母大写 String.capwords(S)& #这是模块中的方法。它把S用split()函数分开,然后用capitalize()把首字母变成大写,最后用join()合并到一起S.title()&&& #只有首字母大写,其余为小写,模块中没有这个方法
字符串去空格及去指定字符去两边空格:str.strip()去左空格:str.lstrip()去右空格:str.rstrip()去两边字符串:str.strip('d'),相应的也有lstrip,rstripstr=' python String function 'print '%s strip=%s' % (str,str.strip())str='python String function'print '%s strip=%s' % (str,str.strip('d'))按指定字符分割字符串为数组:str.split(' ')
字符串编码和解码的函数:S.encode([encoding,[errors]]) # 其中encoding可以有多种值,比如gb2312 gbk gb18030 bz2 zlib big5 bzse64等都支持。errors默认值为strict,意思是UnicodeError。可能的值还有'ignore', 'replace', 'xmlcharrefreS.encode([encoding,[errors]]) # 其中encoding可以有多种值,比如gb2312 gbk gb18030 bz2 zlib big5 bzse64等都支持。errors默认值为"strict",意思是UnicodeError。可能的值还有'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 和所有的通过codecs.register_error注册的值。这一部分内容涉及codecs模块,不是特明白S.decode([encoding,[errors]]) 字符串的测试函数,这一类函数在string模块中没有,这些函数返回的都是bool值:S.startwith(prefix[,start[,end]]) #是否以prefix开头 S.endwith(suffix[,start[,end]])& #以suffix结尾 S.isalnum()& #是否全是字母和数字,并至少有一个字符 S.isalpha()& #是否全是字母,并至少有一个字符 S.isdigit()& #是否全是数字,并至少有一个字符 S.isspace() #是否全是空白字符,并至少有一个字符 S.islower() #S中的字母是否全是小写 S.isupper() #S中的字母是否便是大写 S.istitle() #S是否是首字母大写的字符串类型转换函数,这几个函数只在string模块中有:string.atoi(s[,base])& #base默认为10,如果为0,那么s就可以是012或0x23这种形式的字符串,如果是16那么s就只能是0x23或0X12这种形式的字符串 string.atol(s[,base])& #转成long string.atof(s[,base])& #转成float
python字符串与数字的转化
数字变为字符串 str()字符串变为数字 string.atoi(s,[,base]) //base为进制基数浮点数转换
string.atof(s)
字符串在输出时的对齐:S.ljust(width,[fillchar])&& #输出width个字符,S左对齐,不足部分用fillchar填充,默认的为空格。 S.rjust(width,[fillchar])&&& #右对齐 S.center(width, [fillchar])&&& #中间对齐 S.zfill(width)&& #把S变成width长,并在右对齐,不足部分用0补足
字符串中的单引号,双引号用 \ 来转义。
&怎么把字符串转换成数字?int('1234')string模块里有import string&&& a="12345"&&& import string&&& string.atoi(a)12345&&& b="123.678"&&& string.atof(b)123.678转换成 long,用string.atol()
阅读(...) 评论()python 中的hash - 博客频道 - CSDN.NET
分类:python
Hash 直观的来讲就是函数,在数学里的函数是一个空间到另外一个空间的转换,而hash也是一种函数,一种将任意的输入映射成固定长度的输出,是一种压缩映射。这样很容易想到,假如你把任意的输入映射到4位固定长度的输出上,这个函数空间只能容纳16个不同的数值,所以无论固定长度是64位还是128位亦或者更多总会出现这种所谓的“碰撞”(不同的输入导致散列成相同的输出,所以不可能从散列值来唯一的确定输入值),hash 算法很多但基本的思想都相似,然而simhash我忍为却是其中比较特殊的一类,simhash期初是用来网页去重,速度很快。我接触simhash 是在遇到短文本的时候翻看论文看到的(《基于特征迭代的短文本去重算法》),这篇文章是simhash的思想:在原始空间相近的2个点,经过了相同的变换和映射后,在变换空间里,这2个点仍然是相近的,利用这个思想,距离相近的文本可以通过变换到“指纹空间”上仍然是相近。并利用SNN聚类算法(改进)对所有的指纹进行聚类(SNN基本思想:指纹的周围指纹可以用共享近邻来量化,如果2个指纹具有大部分的相同的最近邻指纹,则两个指纹是在同一簇里。)文章中考虑到短文本相近互为近邻,摒弃了传统的SNN中需要设置K值,所以使用相近短文本数来代替最近邻K的个数,避免了设定最近邻K值(人为的设定K的最有很大的局限性和随意性,具体可参考K—means)。定义了最近邻居:设定距离阈值为min_distance ,如果两个短文的Simhash 指纹之间的海明距离小于min_distance ,则认为是相近的,并定义了指纹相似度与密度。simHash在短文处理优势在于可以结合空间向量模型和聚类算法的,每一次的处理就会提高整体方法的精度。利用TFIDF或者其他的算法,给予词向量权重,经过simHash 形成指纹,计算指纹距离,利用共享近邻算法进行聚类或者去重等等!!
from simhash import Simhash
def get_features(s):
s=s.lower()
s=re.sub(r'[^\w]+','',s)
return [s[i:i+withd] for i in range(max(len(s)-withd+1,1))]
Simhash(get_features("how are you ? I am fine,Thanks")).value
Simhash("aa").distance(Simhash("bb"))
Simhash("aa").distance(Simhash("aa"))
dad=Simhash("I love you,dad")
mom=Simhash("I love you,mom")
Simhash("12").value
hi=Simhash("Hi mom,I love you")
hi.distance(mom)
python-hashes
from hashes.simhash import simhash
hash1 = simhash('This is a test string one.')
print hash1
hash2 = simhash('This is a test string TWO.')
print hash2
hash1.similarity(hash2)
布隆过滤器
from hashes.bloom import bloomfilter
hash3=bloomfilter("test")
hash3.hashbits,hash3.num_hashes
(28756, 7)
hash3.add("test string")
"test string" in hash3
"weiyudang"
hash4 = simhash('this is yet another test', hashbits=8)
hash5 = bloomfilter(capacity=1000000, false_positive_rate=0.0001)
import hashlib
m=hashlib.md5()
m.update('Nobody insepects')
m.digest(),m.digest_size,m.block_size,m.name,m.hexdigest()
('\xf5n\x8e\xaaMc\x05m\xcf\x9b\x1bKR\x14\xf8\xf9',
'f56e8eaa4d63056dcf9b1b4b')
hashlib.algorithms
('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
hashlib.algorithms_available
'DSA-SHA',
'RIPEMD160',
'dsaEncryption',
'dsaWithSHA',
'ecdsa-with-SHA1',
'ripemd160',
'whirlpool'}
print hashlib.md5('liminghao')
&md5 HASH object @ 7B70&
import itertools
from pandas import
str_list=["你是谁 ","我是谁","草拟吗","谁是谁的谁"]
str_list=[line.decode('utf-8') for line in str_list]
Sims=map(Simhash,str_list)
for x,y in itertools.product(Sims,Sims):
A.append(x.distance(y))
[0, 35, 30, 40, 35, 0, 29, 31, 30, 29, 0, 36, 40, 31, 36, 0]
weiyudang11
排名:千里之外
(16)(1)(8)(18)(7)(1)(1)(1)(1)(1)(3)(4)(1)(2)

我要回帖

更多关于 python dict hash函数 的文章

 

随机推荐