Вопрос

В нашем приложении мы генерируем хэш-код из объекта java и сохраняем его в базе данных на некотором уровне.Теперь мои вопросы таковы: если кто-то генерирует число вручную, есть ли способ, которым я могу узнать, является ли это допустимым хэш-кодом, созданным JVM из объекта, а не созданным вручную вручную.

Это было полезно?

Решение

если вы хотите сохранить «подпись» вашего объекта в базе данных, используйте другую функцию. hashCode не предназначен для того, чтобы его было сложно угадать или перепроектировать.

, так как вы использовали hashCode, я предполагаю, что вам не важно иметь одинаковые F (X) = F (Y), где X и Y - разные объекты.

если это действительно так, рассмотрите возможность использования функции хеширования, а может быть, и некоторого «секрета»; поваренная соль. например:

public static String signature(Object o)
{
    StringBuffer sb = new StringBuffer();
    try
    {
        MessageDigest md5 = MessageDigest.getInstance("md5");
        String st = "SECRET!!1" + o.hashCode();
        md5.update(st.getBytes());
        sb.append(getHexString(md5.digest()));
    }
    catch (NoSuchAlgorithmException e)
    {
        throw new RuntimeException("bah");
    }
    catch (UnsupportedEncodingException e)
    {
        throw new RuntimeException("bah2");
    }
    return sb.toString();
}

static final byte[] HEX_CHAR_TABLE =
{
        (byte) '0', (byte) '1', (byte) '2', (byte) '3', 
        (byte) '4', (byte) '5', (byte) '6', (byte) '7', 
        (byte) '8', (byte) '9', (byte) 'a', (byte) 'b',
        (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f'
};

public static String getHexString(byte[] raw) throws UnsupportedEncodingException
{
    byte[] hex = new byte[2 * raw.length];
    int index = 0;

    for (byte b : raw)
    {
        int v = b & 0xFF;
        hex[index++] = HEX_CHAR_TABLE[v >>> 4];
        hex[index++] = HEX_CHAR_TABLE[v & 0xF];
    }
    return new String(hex, "ASCII");
}

Другие советы

Нет, по крайней мере, если он попадает в диапазон int . Любой int является допустимым хеш-кодом. В частности, для любого значения int х хэш new Integer (x) == x .

Я бы сказал, однако, что хранение хеш-кодов объектов Java, как правило, не очень хорошая идея - это нормально, если алгоритм хеширования указан и никогда не изменится, но в противном случае вы столкнетесь с проблемами, когда алгоритм меняется, и ни один из ваших хэшей больше не совпадает.

Нет.Базовая операция hashCode() может возвращать любое значение int при условии, что оно непротиворечиво.Я думаю , настоящий вопрос в том , что вы пытаетесь сделать ?

нет способа найти это как таковой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top