OC与c混编实现Java的String的hashcode()函数
首先,我不愿意大家需要用到這篇文章里的代碼,因為基本上你就是被坑了。
起因:我被Java后臺人員坑了一把,他們要對請求的參數(shù)增加一個額外的字段,字段的用途是來校驗其余的參數(shù)是否再傳遞過程中被篡改或因為網(wǎng)絡原因出現(xiàn)錯誤。校驗就校驗吧,居然選了Java的String的hashcode()函數(shù)作為校驗手段,安卓自然完全沒有問題。但是iOS上。。。。。我又繼續(xù)詢問他能否改成比較通用的校驗手段,比如md5等,反饋是安卓已經(jīng)上線了。然后無奈職能按照Java的實現(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; }我寫個了個分類處理這個hashcode
首先獲取每個字符,獲取到字符后轉(zhuǎn)成unicode,這里調(diào)試了很久,因為安卓的同事認為是utf8編碼,因為這跟網(wǎng)上許多加密結果顯示的是一致,經(jīng)過仔細比對,發(fā)現(xiàn)是unicode編碼。如果是中文字的話,那么就是2個字節(jié),因為編碼后是以char *輸出,所有對兩個字節(jié)進行合并成一個short類型。如果是英文或標點,那么就是1個字節(jié),我為樂整齊,就統(tǒng)一用for循環(huán)。其實獲取到了length不是1個就是2。
盡管代碼很短,但是已經(jīng)很長時間沒有直接使用c了,連著調(diào)試和尋找編碼的格式,還是花了不少時間。希望你們別走彎路,不到萬不得已不要這樣校驗。
轉(zhuǎn)載于:https://www.cnblogs.com/qianhongqiang/p/5333732.html
總結
以上是生活随笔為你收集整理的OC与c混编实现Java的String的hashcode()函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cassandra 2016/00
- 下一篇: 软考中高项学员:2016年3月14日作业