Я хотел создать уникальный хеш-код для строки в android. Есть ли какая-либо предопределенная библиотека, или мы должны генерировать вручную. Пожалуйста, любой орган, если он знает, сообщите ссылку или код.
Как сгенерировать уникальный хэш-код для ввода строки в android...?
Ответ 1
Это зависит от того, что вы имеете в виду:
-
Как уже упоминалось,
String.hashCode()
дает 32-битный хэш-код. -
Если вы хотите (скажем) 64-битный хэш-код, вы можете легко реализовать его самостоятельно.
-
Если вам нужен криптографический хеш String, то в криптографических библиотеках Java реализованы реализации MD5, SHA-1 и т.д. Обычно вам нужно превратить String в массив байтов, а затем передать это генератору хэш-генератора/дайджеста. Например, см. Ответ @Bryan Kemp.
-
Если вам нужен хеш-код гарантированный уникальный, вам не повезло. Хэши и хэш-коды не являются уникальными.
Java String длины N имеет 65536 ^ N
возможные состояния и требует целое число с битами 16 * N
для представления всех возможных значений. Если вы пишете хеш-функцию, которая производит целое число с меньшим диапазоном (например, менее чем 16 * N
bits), вы, в конце концов, найдете случаи, когда более одного хэша String совпадают с одним и тем же целым числом; т.е. хэш-коды не могут быть уникальными. Это называется принцип Pigeonhole, и есть прямое математическое доказательство. (Вы не можете бороться с математикой и побеждать!)
Но если "возможно уникальное" с очень небольшой вероятностью неединственности приемлемо, то криптографические хэши являются хорошим ответом. Математика скажет вам, насколько велика (т.е. Сколько бит) хэш должен быть для достижения заданной (достаточно низкой) вероятности неединственности.
Ответ 2
Это класс, который я использую для создания хэшей Message Digest
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Sha1Hex {
public String makeSHA1Hash(String input)
throws NoSuchAlgorithmException, UnsupportedEncodingException
{
MessageDigest md = MessageDigest.getInstance("SHA1");
md.reset();
byte[] buffer = input.getBytes("UTF-8");
md.update(buffer);
byte[] digest = md.digest();
String hexStr = "";
for (int i = 0; i < digest.length; i++) {
hexStr += Integer.toString( ( digest[i] & 0xff ) + 0x100, 16).substring( 1 );
}
return hexStr;
}
}
Ответ 3
String input = "some input string";
int hashCode = input.hashCode();
System.out.println("input hash code = " + hashCode);
Ответ 4
Вы можете использовать этот код для генерации кода для данной строки.
int hash = 7;
for (int i = 0; i < strlen; i++) {
hash = hash*31 + charAt(i);
}
Ответ 5
Несколько строк кода Java.
public static void main(String args[]) throws Exception{
String str="test string";
MessageDigest messageDigest=MessageDigest.getInstance("MD5");
messageDigest.update(str.getBytes(),0,str.length());
System.out.println("MD5: "+new BigInteger(1,messageDigest.digest()).toString(16));
}
Ответ 6
Посмотрим на метод hashCode():
public int hashCode() {
int h = hash;
if (h == 0 && count > 0) {
for (int i = 0; i < count; i++) {
h = 31 * h + charAt(i);
}
hash = h;
}
return h;
}
Блок кода выше относится к классу java.lang.String. Как вы можете видеть, это 32-битный хеш-код, который достаточно справедлив, если вы используете его в небольшом масштабе данных. Если вы ищете хэш-код с более чем 32 бит, вы можете проверить эту ссылку: http://www.javamex.com/tutorials/collections/strong_hash_code_implementation.shtml