Подтвердить что ты не робот

Как сгенерировать уникальный хэш-код для ввода строки в android...?

Я хотел создать уникальный хеш-код для строки в android. Есть ли какая-либо предопределенная библиотека, или мы должны генерировать вручную. Пожалуйста, любой орган, если он знает, сообщите ссылку или код.

4b9b3361

Ответ 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