iOS 數(shù)據(jù)統(tǒng)計優(yōu)化策略 字符串轉大數(shù) OC類似java的hashcode實現(xiàn)

需求:背景減低服務器存儲壓力,優(yōu)化客戶端上報數(shù)據(jù)大小用于節(jié)省用戶網(wǎng)絡。這個就需要字符串轉大樹或者轉枚舉。字符串md5轉為一個32位的大數(shù)烂叔,降低服務器存儲空間,優(yōu)化客戶端發(fā)送數(shù)據(jù)量

在java里面實現(xiàn)比較簡單固歪,底層提供了hashcode接口

@Override public int hashCode() {
        int hash = hashCode;
        if (hash == 0) {
            if (count == 0) {
                return 0;
            }
            final int end = count + offset;
            final char[] chars = value;
            for (int i = offset; i < end; ++i) {
                hash = 31*hash + chars[i];
            }
            hashCode = hash;
        }
        return hash;
    }

在iOS里模仿java實現(xiàn)一個

- (int64_t)convertStringToBigNumberInt64:(NSString *)string
{
    if (string == nil || string.length == 0 )
    {
        return 0;
    }
    
    int i = 0;
    int64_t hash = 0;
    
    const char * charString =[string UTF8String];
    for (i = 0; i < strlen(charString); i++) 
   {
       hash = hash * 31 + charString[i];
   }
   
    return hash % INT64_MAX;
}

當然iOS中NSString 有一個接口為hash返回可返回類似的大數(shù)蒜鸡,

 */
#define HashEverythingLimit 96

#define HashNextFourUniChars(accessStart, accessEnd, pointer) 
    {result = result * 67503105 + (accessStart 0 accessEnd) * 16974593  + (accessStart 1 accessEnd) * 66049  + (accessStart 2 accessEnd) * 257 + (accessStart 3 accessEnd); pointer += 4;}
#define HashNextUniChar(accessStart, accessEnd, pointer) 
    {result = result * 257 + (accessStart 0 accessEnd); pointer++;}

CF_INTERNAL CFHashCode __CFStrHashCharacters(const UniChar* uContents, CFIndex len, CFIndex actualLen) {
    CFHashCode result = actualLen;
    if (len <= HashEverythingLimit) {
        const UniChar* end4 = uContents + (len & ~3);
        const UniChar* end = uContents + len;
        while (uContents < end4) {
            HashNextFourUniChars(uContents[, ], uContents); // First count in fours
        }
        while (uContents < end) {
            HashNextUniChar(uContents[, ], uContents); // Then for the last <4 chars, count in ones...
        }
    } else {
        const UniChar* contents, * end;
        contents = uContents;
        end = contents + 32;
        while (contents < end) {
            HashNextFourUniChars(contents[, ], contents);
        }
        contents = uContents + (len >> 1) - 16;
        end = contents + 32;
        while (contents < end) {
            HashNextFourUniChars(contents[, ], contents);
        }
        end = uContents + len;
        contents = end - 32;
        while (contents < end) {
            HashNextFourUniChars(contents[, ], contents);
        }
    }
    return result + (result << (actualLen & 31));
}

由源碼可知道,字符串的長度如果大于96昼牛,其策略為取前32位 取中段32位 后取后端32位,在取值為準字符相同的情況下术瓮,其他任意位置的字符發(fā)生改變,Hash值都不會變贰健。字符串的長度如果小于等于96胞四,所有字符將參與運算,也就是說96個字符改變其中任意一個都將導致hash值的變化伶椿。

當然不是所有的32位都能滿足辜伟,有時候需要用64位來降低碰撞概率,有時候32位過多脊另,只需要16位2個字節(jié)的导狡,可以根據(jù)上面算法自己調(diào)整或者求模運算保bigNumber落在特定的整形數(shù)范圍內(nèi)。

源碼來自偎痛,https://github.com/DmitrySkiba/itoa-cleancf/blob/9e20484344430008a8b1a0e7c0f29aa06eac3d1e/src/CoreFoundation/CFString/CFString_Hash.c

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旱捧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枚赡,老刑警劉巖氓癌,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滩字,死亡現(xiàn)場離奇詭異咽安,居然都是意外死亡,警方通過查閱死者的電腦和手機咒钟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門卢肃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疲迂,“玉大人,你說我怎么就攤上這事莫湘∮容铮” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵幅垮,是天一觀的道長优质。 經(jīng)常有香客問我,道長军洼,這世上最難降的妖魔是什么巩螃? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮匕争,結果婚禮上避乏,老公的妹妹穿的比我還像新娘。我一直安慰自己甘桑,他們只是感情好拍皮,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跑杭,像睡著了一般铆帽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上德谅,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天爹橱,我揣著相機與錄音,去河邊找鬼窄做。 笑死愧驱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的椭盏。 我是一名探鬼主播组砚,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掏颊!你這毒婦竟也來了糟红?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盆偿,沒想到半個月后掩蛤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡陈肛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了兄裂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片句旱。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晰奖,靈堂內(nèi)的尸體忽然破棺而出谈撒,到底是詐尸還是另有隱情,我是刑警寧澤匾南,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布啃匿,位于F島的核電站,受9級特大地震影響蛆楞,放射性物質發(fā)生泄漏溯乒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一豹爹、第九天 我趴在偏房一處隱蔽的房頂上張望裆悄。 院中可真熱鬧,春花似錦臂聋、人聲如沸光稼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艾君。三九已至,卻和暖如春肄方,著一層夾襖步出監(jiān)牢的瞬間冰垄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工权她, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留播演,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓伴奥,卻偏偏與公主長得像写烤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拾徙,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 教你如何迅速秒殺掉:99%的海量數(shù)據(jù)處理面試題 本文經(jīng)過大量細致的優(yōu)化后洲炊,收錄于我的新書《編程之法》第六章中,新書...
    Helen_Cat閱讀 7,407評論 1 39
  • Map 是一種很常見的數(shù)據(jù)結構询微,用于存儲一些無序的鍵值對。在主流的編程語言中狂巢,默認就自帶它的實現(xiàn)撑毛。C、C++ 中的...
    一縷殤流化隱半邊冰霜閱讀 9,255評論 23 67
  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx唧领?那么一定聽過它的“同行”Apache吧藻雌!Ngi...
    JokerW閱讀 32,646評論 24 1,002
  • 2017年1月12日 星期四 陰雨天 今天是寒假的第一天,本來要和同學出去玩“...
    張樂頤閱讀 172評論 0 0
  • 《放牛班的春天》觀后感 放牛班里可沒有牛斩个,而是一座叫做池塘之底的學校胯杭,里面是一群被放逐的孩子和殘暴的校長、冰冷的老...
    亦北閱讀 517評論 0 2