OC与c混编实现Java的String的hashcode()函数
首先,我不愿意大家需要用到這篇文章里的代碼,因?yàn)榛旧夏憔褪潜豢恿恕?br /> 起因:我被Java后臺(tái)人員坑了一把,他們要對(duì)請(qǐng)求的參數(shù)增加一個(gè)額外的字段,字段的用途是來校驗(yàn)其余的參數(shù)是否再傳遞過程中被篡改或因?yàn)榫W(wǎng)絡(luò)原因出現(xiàn)錯(cuò)誤。校驗(yàn)就校驗(yàn)吧,居然選了Java的String的hashcode()函數(shù)作為校驗(yàn)手段,安卓自然完全沒有問題。但是iOS上。。。。。我又繼續(xù)詢問他能否改成比較通用的校驗(yàn)手段,比如md5等,反饋是安卓已經(jīng)上線了。然后無奈職能按照J(rèn)ava的實(shí)現(xiàn)做了一把。
先貼出代碼吧
-(int)DF_hashCode {int hash = 0;for (int i = 0; i<[self length]; i++) {NSString *s = [self substringWithRange:NSMakeRange(i, 1)];char *unicode = (char *)[s cStringUsingEncoding:NSUnicodeStringEncoding];int charactorUnicode = 0;size_t length = strlen(unicode);for (int n = 0; n < length; n ++) {charactorUnicode += (int)((unicode[n] & 0xff) << (n * sizeof(char) * 8));}hash = hash * 31 + charactorUnicode;}return hash; }我寫個(gè)了個(gè)分類處理這個(gè)hashcode
首先獲取每個(gè)字符,獲取到字符后轉(zhuǎn)成unicode,這里調(diào)試了很久,因?yàn)榘沧康耐抡J(rèn)為是utf8編碼,因?yàn)檫@跟網(wǎng)上許多加密結(jié)果顯示的是一致,經(jīng)過仔細(xì)比對(duì),發(fā)現(xiàn)是unicode編碼。如果是中文字的話,那么就是2個(gè)字節(jié),因?yàn)榫幋a后是以char *輸出,所有對(duì)兩個(gè)字節(jié)進(jìn)行合并成一個(gè)short類型。如果是英文或標(biāo)點(diǎn),那么就是1個(gè)字節(jié),我為樂整齊,就統(tǒng)一用for循環(huán)。其實(shí)獲取到了length不是1個(gè)就是2。
盡管代碼很短,但是已經(jīng)很長時(shí)間沒有直接使用c了,連著調(diào)試和尋找編碼的格式,還是花了不少時(shí)間。希望你們別走彎路,不到萬不得已不要這樣校驗(yàn)。
轉(zhuǎn)載于:https://www.cnblogs.com/qianhongqiang/p/5333732.html
總結(jié)
以上是生活随笔為你收集整理的OC与c混编实现Java的String的hashcode()函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cassandra 2016/00
- 下一篇: 软考中高项学员:2016年3月14日作业