2010-05-18 11 views
5

मेरे पास मेरे आईफोन प्रोजेक्ट में एक HTTP कनेक्टर है और प्रश्नों में फाउलर-नोल-वो (एफएनवी) हैश का उपयोग कर उपयोगकर्ता नाम से एक पैरामीटर सेट होना चाहिए।उद्देश्य-सी: फाउलर-नोल-वो (एफएनवी) हैश कार्यान्वयन

मैं इस समय काम कर रहे एक जावा कार्यान्वयन है, यह कोड है:

int64_t fnv_prime = 0x811C9DC5; 
int64_T hash = 0; 

for (int i=0; i < [myString length]; i++) 
{ 
    hash *= fnv_prime; 
    hash ^= [myString characterAtIndex:i]; 
} 

यह स्क्रिप्ट मुझे नहीं देता:

long fnv_prime = 0x811C9DC5; 
long hash = 0; 

for(int i = 0; i < str.length(); i++) 
{ 
    hash *= fnv_prime; 
    hash ^= str.charAt(i); 
} 

अब iPhone पक्ष पर, मैं इस किया था उसी परिणाम में जावा एक है।

हैश = 0

हैश = 100 (पहले अक्षर है "d")

हैश = +१८६५२६१३०० (हैश = 100 और fnv_prime के लिए = -:

पहले पाश में, मैं यह मिलता है 2128831035 जावा में जैसे)

क्या कोई मुझे कुछ याद कर रहा है?

मदद के लिए अग्रिम धन्यवाद!

उत्तर

4

जावा में, इस लाइन:

long fnv_prime = 0x811C9DC5; 

क्योंकि लगातार एक int, जो जावा में एक 32-बिट पर हस्ताक्षर किए मूल्य के रूप में स्वीकार किया जाता है, संख्यात्मक मूल्य -२१२८८३१०३५ fnv_prime में निकलेगा। long में लिखा गया है कि उस मान को तब साइन-विस्तारित किया जाता है।

इसके विपरीत, ऑब्जेक्टिव-सी कोड में:

int64_t fnv_prime = 0x811C9DC5; 

0x811C9DC5, एक unsigned int निरंतर रूप में व्याख्या की है संख्यात्मक मूल्य 2166136261. कि मूल्य के साथ (क्योंकि यह एक हस्ताक्षरित 32-बिट int में फिट नहीं करता है) तब fnv_prime में लिखा जाता है, और जब तक सी कंपाइलर का संबंध है, तब तक विस्तार करने के लिए कोई संकेत नहीं है, मान सकारात्मक है।

इस प्रकार आप fnv_prime के लिए अलग-अलग मानों के साथ समाप्त होते हैं, जो आपके विशिष्ट परिणामों को बताते हैं।

यह जावा में इस तरह एक "L" प्रत्यय जोड़ने, सुधारा जा सकता है:

long fnv_prime = 0x811C9DC5L; 

जो जावा कम्पाइलर बलों एक long के रूप में लगातार व्याख्या करने के लिए, तुम क्या मिल की तुलना में एक ही संख्यात्मक मूल्य के साथ उद्देश्य-सी कोड के साथ।

+0

जावा में ओब्जे-सी के रूप में मुझे प्राइम = -2128831035 के लिए एक ही मान मिलता है जब मैं "0x811C9DC5L" डालता हूं तो मुझे मूल्य = 2166136261 – Dough

+0

मिलता है आपको ओबज-सी में -2128831035 नहीं मिलना चाहिए। क्या आप वाकई इस मूल्य को प्रिंट करने के बारे में एक आर्टेफैक्ट नहीं हैं? (यानी आपने अपने 'printf() '? –

+0

में"% lld "या"% d "का उपयोग किया था और एक सुराग है कि -2128831035 सही संख्यात्मक मान नहीं है: यह प्रमुख नहीं है! -2128831035 = - (3 * 5 * 17 * 101 * 82657) –

0

क्या जावा और ऑब्जेक्टिव-सी में वर्ण समान हैं? एनएसएसटींग आपको अनचाहे देगा।

+0

आपके उत्तर के लिए धन्यवाद! चार, जावा में उद्देश्य-सीएन चार के ASCII मान को वापस कर रहा है। उदाहरण के लिए: एक = 97 ख = 98 ग = 99 घ = 100 और इतने पर! – Dough

+0

@dough: यह निश्चित रूप से ASCII का उपयोग नहीं कर रहा है, हालांकि पहले 127 वर्णों में समान संख्यात्मक मान हो सकते हैं। एक अभ्यास के रूप में, यदि आप चरित्र 'फ्ल' प्रिंट करते हैं तो आपको क्या मिलता है? और 'FL' का ASCII मान क्या है? –

+0

'fl' एक चरित्र नहीं है, यह दो है: एफ और एल! – Dough

1

यह 32-बिट मान 0x811C9DC5 को 64-बिट var पर असाइन करने वाले साइन एक्सटेंशन में एक अंतर है।

+0

यह वास्तव में है। –

1

संयोग से, 0x811C9DC5 एक एफएनवी प्राइम (यह भी प्रमुख नहीं है); यह 32 बिट एफएनवी "ऑफसेट आधार" है। यदि आप इस मान (और अधिक हैश टकराव) का उपयोग करते हैं तो आपको गलत हैश मान मिलेंगे। 32 बिट एफएनवी प्राइम के लिए सही मान 0x1000193 है।देखें http://www.isthe.com/chongo/tech/comp/fnv/index.html

संबंधित मुद्दे