Функция хеширования, совместимая с Arrays.hashCode

1

Я переношу нагрузку кода, чтобы остановить передачу байтов [] s, InputStreams и InputSuppliers и просто использовать ByteSource.

В настоящее время код вычисляет и ETag для данных, используя Arrays.hashCode в сыром байте [], что переводится с помощью ByteSource:

Arrays.hashCode(dataSource.read());

Проблема заключается в том, что dataSource.read() в ByteArrayInputSource клонирует базовый байт [], что хуже, чем в настоящее время.

Я хотел бы использовать dataSource.hash(HashFunction) но я хочу убедиться, что я не разрушаю ETags, сгенерированные с помощью hashCode, так как это приведет к недействительности кэша.

Кто-нибудь знает о HashFunction, который выполняет эту работу для меня?

  • 0
    Почему бы вам не реализовать вычисление хеша, как описано в документации API Arrays.hashCode?
  • 0
    Я могу, но я бы хотел расширить AbstractNonStreamingHashFunction, которая является пакетной, досадно.
Теги:
hashcode
guava
bytearray

1 ответ

0
Лучший ответ

Я не знаю какой-либо уже доступной функции HashFunction которая будет делать то, что вы хотите, но ее очень легко написать. Что-то вроде:

public final class ByteArrayHashFunction extends AbstractStreamingHashFunction {

  @Override
  public Hasher newHasher() {
    return new ByteArrayHasher();
  }

  @Override
  public int bits() {
    return 32;
  }

  private static final class ByteArrayHasher extends AbstractByteHasher {

    private int hash = 1;

    @Override
    protected void update(byte b) {
      hash = 31 * hash + b;
    }

    @Override
    public HashCode hash() {
      return HashCode.fromInt(hash);
    }
  }
}

Однако вам нужно будет скопировать несколько абстрактных классов из common.hash в ваш собственный пакет.

  • 0
    Да, к такому выводу я пришел. На самом деле мне нужно только реализовать hashBytes (), поэтому я просто вызвал Arrays.hashCode через это.
  • 0
    @BenSmith: Предполагая, что вы ссылаетесь на AbstractNonStreamingHashFunction , я настоятельно рекомендую использовать AbstractStreamingHashFunction как я это сделал здесь. AbstractNonStreamingHashFunction (как следует из «не потоковой» части имени) не работает хорошо для обработки потока байтов. Он предназначен для хеш-функций, которые должны обрабатывать набор байтов одновременно, и поэтому он буферизует все, что ему записано, до тех пор, пока вы не вызовете hash() . С другой стороны, алгоритм, который использует Arrays.hashCode , очень удобен для потоковой передачи.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню