मैं रोलिंग हैश फ़ंक्शन का उपयोग करने के लिए देख रहा हूं, इसलिए मैं बहुत बड़ी स्ट्रिंग के एन-ग्राम के हैंश ले सकता हूं।क्या राबिन-कार्प स्ट्रिंग खोज एल्गोरिदम में उपयोग किए जाने वाले रोलिंग हैश फ़ंक्शन का कोई कामकाजी कार्यान्वयन है?
"stackoverflow", 5 ग्राम में टूट किया जाएगा:
उदाहरण के लिए"ढेर", "Tacko", "ackov", "ckove", "kover", "overf", "verfl", "erflo", "rflow"
यह एक रोलिंग हैश फंक्शन के लिए आदर्श है क्योंकि के बाद मैं पहली बार एन-ग्राम हैश की गणना, निम्नलिखित लोगों क्योंकि मैं गणना करने के लिए अपेक्षाकृत सस्ती हैं बस पहले हैश के पहले अक्षर को छोड़ना है और जोड़ना है दूसरे हैश का नया अंतिम पत्र।
मुझे पता है कि सामान्य रूप में इस हैश समारोह उत्पन्न होता है के रूप में:
एच = ग एक कश्मीर - 1 + स एक कश्मीर - 2 + स एक के - 3 + ... + सी के जहां एक स्थिर और सी 1 है, ..., सीके इनपुट वर्ण हैं।
यदि आप Rabin-Karp string search algorithm पर इस लिंक का पालन करते हैं, तो यह कहता है कि "ए" आमतौर पर कुछ बड़ा प्रधान होता है।
मैं चाहता हूं कि मेरे हैंश को 32 बिट पूर्णांक में संग्रहीत किया जाए, तो एक प्रमुख को कितना बड़ा होना चाहिए, जैसे कि मैं अपने पूर्णांक को ओवरफ़्लो नहीं करता?
क्या इस हैश फ़ंक्शन का मौजूदा कार्यान्वयन कहीं भी मौजूद है जिसका मैं पहले से उपयोग कर सकता हूं?
public class hash2
{
public int prime = 101;
public int hash(String text)
{
int hash = 0;
for(int i = 0; i < text.length(); i++)
{
char c = text.charAt(i);
hash += c * (int) (Math.pow(prime, text.length() - 1 - i));
}
return hash;
}
public int rollHash(int previousHash, String previousText, String currentText)
{
char firstChar = previousText.charAt(0);
char lastChar = currentText.charAt(currentText.length() - 1);
int firstCharHash = firstChar * (int) (Math.pow(prime, previousText.length() - 1));
int hash = (previousHash - firstCharHash) * prime + lastChar;
return hash;
}
public static void main(String[] args)
{
hash2 hashify = new hash2();
int firstHash = hashify.hash("mydog");
System.out.println(firstHash);
System.out.println(hashify.hash("ydogr"));
System.out.println(hashify.rollHash(firstHash, "mydog", "ydogr"));
}
}
मैं अपने प्रधानमंत्री के रूप में 101 का उपयोग कर रहा:
यहाँ एक कार्यान्वयन मैं बनाया है। क्या इससे कोई फर्क पड़ता है कि मेरे हैंश बह जाएंगे? मुझे लगता है कि यह वांछनीय है लेकिन मुझे यकीन नहीं है।
क्या यह इस बारे में जाने का सही तरीका प्रतीत होता है?
इस एप्लिकेशन के लिए प्राइम "सामान्य" स्ट्रिंग हैशकोड पीढ़ी से अलग क्यों होगा? – CPerkins
एल्गोरिदम इतना आसान है कि छद्म कोड से इसे लागू करना बहुत आसान है। क्या आपने इसे स्वयं कोडिंग करने का प्रयास किया है? – MAK