Как создать уникальный хэш-код для ввода строки в Android ...? - PullRequest
46 голосов
/ 25 мая 2011

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

Ответы [ 8 ]

59 голосов
/ 25 мая 2011

Это зависит от того, что вы имеете в виду:

  • Как уже упоминалось, String.hashCode() дает вам 32-битный хэш-код.

  • Если вы хотите(скажем, 64-битный хеш-код, вы можете легко реализовать его самостоятельно.

  • Если вы хотите криптографический хеш-код строки, библиотеки Java-шифрования включают в себя реализации MD5, SHA-1 искоро.Обычно вам нужно превратить строку в байтовый массив, а затем передать его генератору хеша / генератору дайджеста.Например, см. Ответ @Bryan Kemp.

  • Если вам нужен гарантированный уникальный хэш-код, вам не повезло.Хеши и хеш-коды не являются уникальными.

Строка Java длиной N имеет 65536 ^ N возможных состояний и требует целого числа с 16 * N битами для представления всех возможных значений.Если вы напишите хеш-функцию, которая выдает целое число с меньшим диапазоном (например, менее 16 * N бит), вы в конечном итоге найдете случаи, когда более одной строки хеширует одно и то же целое число;т.е. хеш-коды не могут быть уникальными.Это называется принципом Pigeonhole , и существует прямое математическое доказательство.(Вы не можете бороться с математикой и побеждать!)

Но если «вероятно, уникален» с очень небольшим шансом неединственности, то крипто-хэши - хороший ответ.Математика скажет вам, насколько большим (то есть, сколько битов) должен быть хеш для достижения заданной (достаточно низкой) вероятности неединственности.

34 голосов
/ 25 мая 2011

Это класс, который я использую для создания хэшей 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;
        }
}
8 голосов
/ 25 мая 2011
String input = "some input string";
int hashCode = input.hashCode();
System.out.println("input hash code = " + hashCode);
3 голосов
/ 18 августа 2016

Вы можете использовать этот код для генерации кода для данной строки.

int hash = 7;
for (int i = 0; i < strlen; i++) {
    hash = hash*31 + charAt(i);
}
2 голосов
/ 23 января 2018

Я использую это, я проверил это как ключ от моей EhCacheManager Карты памяти ....

Я думаю, его чище

   /**
     * Return Hash256 of String value
     *
     * @param text
     * @return 
     */
    public static String getHash256(String text) {
        try {
            return org.apache.commons.codec.digest.DigestUtils.sha256Hex(text);
        } catch (Exception ex) {
            Logger.getLogger(HashUtil.class.getName()).log(Level.SEVERE, null, ex);
            return "";
        }
    }

Я использую Maven, но это банка Обще-кодек-1.9.jar

1 голос
/ 26 октября 2017

Несколько строк кода 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));
}
0 голосов
/ 13 апреля 2018

у меня это сработало

   public static long getUniqueLongFromString (String value){
       return  UUID.nameUUIDFromBytes(value.getBytes()).getMostSignificantBits();
    }
0 голосов
/ 20 сентября 2017

Давайте посмотрим на стандартный метод 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...