2016-11-17 6 views
5

हैश में String का हैश बनाने का सबसे अच्छा तरीका क्या है, यदि हैश में 4 से अधिक वर्ण नहीं हो सकते हैं, और वे 4 वर्ण केवल छोटे अक्षरों या अंक हो सकते हैं?अधिकतम 4 अक्षर के साथ अद्वितीय हैश?

तार जो मैं चाहता हूं उसके पास 1-255 वर्ण हैं। मुझे पता है कि टकराव के बिना 4-चार हैश के रूप में बनाना असंभव है। लेकिन यह पर्याप्त होगा यदि मेरे पास एक अच्छा हैश हो जहां संभावित टक्कर कम हो जाएं।

मैं क्या करने की कोशिश की यहाँ से CRC16CCITT है: http://introcs.cs.princeton.edu/java/61data/CRC16CCITT.java

public class CRC16CCITT { 

    public static void main(String[] args) { 
     int crc = 0xFFFF;   // initial value 
     int polynomial = 0x1021; // 0001 0000 0010 0001 (0, 5, 12) 

     // byte[] testBytes = "123456789".getBytes("ASCII"); 

     byte[] bytes = args[0].getBytes(); 

     for (byte b : bytes) { 
      for (int i = 0; i < 8; i++) { 
       boolean bit = ((b >> (7-i) & 1) == 1); 
       boolean c15 = ((crc >> 15 & 1) == 1); 
       crc <<= 1; 
       if (c15^bit) crc ^= polynomial; 
      } 
     } 

     crc &= 0xffff; 
     StdOut.println("CRC16-CCITT = " + Integer.toHexString(crc)); 
    } 

} 

लेकिन यह भी कई टक्कर देता है। क्या बेहतर एल्गोरिदम हैं?

+8

लोअरकेस अक्षरों और संख्याओं का मतलब है कि केवल 36^4 विभिन्न हैंश हैं, इसलिए, एक हैशिंग फ़ंक्शन के साथ भी जो समान रूप से वितरित हैश उत्पन्न करता है, आपके पास ~ sqrt (36) होने के बाद टकराव नहीं होने की संभावना अधिक होती है^4) = 12 9 6 मूल्य (जन्मदिन विरोधाभास द्वारा)। आपको हैश स्पेस में बस अधिक संभावित मानों की आवश्यकता है। –

+0

इस पर एक नज़र डालने के लिए उपयोगी हो सकता है: http://stackoverflow.com/questions/12076846/using-a-larger-prime-as-a-multiplier-when-overriding-hashcode – posdef

+0

@ एंडी टर्नर स्पष्टीकरण के लिए धन्यवाद। वैसे भी मैं 4 वर्ण तक सीमित हूं, इसलिए मुझे पता है कि मेरे पास डिजाइन द्वारा nonunique हैश होगा। लेकिन मैं एक एल्गोरिदम की तलाश में हूं जो मुझे "हड़पने की संभावना कम" देता है। – membersound

उत्तर

0

आप "वर्ण" के लिए "हेक्साडेसिमल अंक" भूल जाते हैं:

int crc = 0xFFFF;   // initial value 

केवल 2 बाइट्स है कि (0xFF सिर्फ 1 बाइट है)। 4 एएनएसआई अक्षरों के सीआरसी के लिए, आपको 4 बाइट्स (0xFFFFFFFF) की आवश्यकता है।
आपको पैर के दोगुने के साथ काम करने के लिए शेष कोड को अनुकूलित करना होगा, अगर आप नहीं जानते कि यह कैसे करना है, तो कृपया टिप्पणी करें।

पीएस: आप इसे 4 बाइट से कम के साथ कर सकते हैं, लेकिन यह आवश्यकतानुसार चीजों को जटिल करेगा।

+0

मुझे सीआरसी एल्गोरिदम या बाइट एन्कोडिंग में अनुभव नहीं है।मैंने अभी अपने प्रश्न में जुड़े उदाहरण वर्ग को लिया है। अगर आप 4 ansi chars के अनुसार एक अनुकूलित एल्गोरिदम दे सकते हैं तो बहुत अच्छा होगा। – membersound

+0

32 बिट (4 बाइट्स) संस्करण पर एक नज़र डालें, "प्रत्यक्ष गणना" भाग अंत में है: http://introcs.cs.princeton.edu/java/61data/CRC32.java.html – walen

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