हैश में 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));
}
}
लेकिन यह भी कई टक्कर देता है। क्या बेहतर एल्गोरिदम हैं?
लोअरकेस अक्षरों और संख्याओं का मतलब है कि केवल 36^4 विभिन्न हैंश हैं, इसलिए, एक हैशिंग फ़ंक्शन के साथ भी जो समान रूप से वितरित हैश उत्पन्न करता है, आपके पास ~ sqrt (36) होने के बाद टकराव नहीं होने की संभावना अधिक होती है^4) = 12 9 6 मूल्य (जन्मदिन विरोधाभास द्वारा)। आपको हैश स्पेस में बस अधिक संभावित मानों की आवश्यकता है। –
इस पर एक नज़र डालने के लिए उपयोगी हो सकता है: http://stackoverflow.com/questions/12076846/using-a-larger-prime-as-a-multiplier-when-overriding-hashcode – posdef
@ एंडी टर्नर स्पष्टीकरण के लिए धन्यवाद। वैसे भी मैं 4 वर्ण तक सीमित हूं, इसलिए मुझे पता है कि मेरे पास डिजाइन द्वारा nonunique हैश होगा। लेकिन मैं एक एल्गोरिदम की तलाश में हूं जो मुझे "हड़पने की संभावना कम" देता है। – membersound