Nano Hash - криптовалюты, майнинг, программирование

Хэш-таблица, использующая байт [] в качестве ключа, не обнаруживает повторяющиеся ключи [дубликаты]

Задний план

У меня есть несколько файлов, для которых я запускаю хэши, и мне нужно знать, существуют ли эти файлы уже или нет. Я сохраняю хэши (как дайджест байта Byte[]) и путь к файлу (как путь) в хеш-таблице, чтобы сделать это быстро и чтобы я мог напечатать правильное сообщение о дубликатах.

Проблема

Проблема, с которой я сталкиваюсь, заключается в том, что реализация Hashtable или byte[] приводит к тому, что адрес или, возможно, значение toString() используется в качестве ключа. Я мог бы преобразовать дайджест байтов в удобочитаемую строку, но меня беспокоят накладные расходы, поскольку нужно проверить много небольших файлов.

Вопрос

Верен ли я в своих предположениях о том, что хеш-таблица использует адрес вместо значения, и если да, то как убедиться, что вместо этого используется значение?

Код

static Hashtable<byte[], Path> htable = new Hashtable<byte[], Path>();

public static void main(String[] args) throws NoSuchAlgorithmException, IOException {

    String file = "Z:\\file.txt";
    String file2 = "Z:\\file2.txt";
        
    // First file
    Path filePath = Paths.get(file);
    doHashStore(filePath);
        
    // Second file
    filePath = Paths.get(file2);
    doHashStore(filePath);
        
    // First again, should notify already exists
    filePath = Paths.get(file);
    doHashStore(filePath);
}

// Add to table
private static void doHashStore(Path p) throws NoSuchAlgorithmException, IOException{
    byte[] md5 = doMD5(p);
    if(htable.containsKey(md5)) {
        System.out.println(p.toString()+" already in table! "+toHexadecimal(md5));
    } else {
        htable.put(md5, p);
        System.out.println(p.toString()+" added to table "+toHexadecimal(md5));
    }
}

// Perform the md5 hash
private static byte[] doMD5(Path filePath) throws IOException, NoSuchAlgorithmException{
    byte[] b = Files.readAllBytes(filePath);
    byte[] c = MessageDigest.getInstance("MD5").digest(b);
    return c;
}

// Convert the byte[] from digest into a human readable hash string
private static String toHexadecimal(byte[] digest){
    String hash = "";
    for(byte aux : digest) {
        int b = aux & 0xff;
        if (Integer.toHexString(b).length() == 1)
            hash += "0";
        hash += Integer.toHexString(b);
    }
    return hash;
}

  • Ваше предположение верно, но адрес не всегда может использоваться как hashCode. Кроме того, массивы являются динамическими классами, поэтому вы ничего не можете с этим поделать. 29.01.2017
  • Решением будет создание простого класса-оболочки для ваших объектов byte[], который переопределяет equals и hashCode по мере необходимости. 29.01.2017

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..