Самый быстрый хеш логических и целых чисел? - PullRequest
0 голосов
/ 30 мая 2018

Моя главная цель - уметь сравнивать конкретные объекты (которые имеют одинаковый тип) по значению, а не по ссылке.Каждое значение в объекте является либо логическим, либо числом, и скорость имеет решающее значение.

Разбивая это немного, я ищу очень быструю функцию, которая выходит из этого объекта в строку или число (т. е. хэш), так что я могу искать сравнения в хэш-таблице.

Я рад, что все запросы на увеличение скорости мне нравятся - он не должен быть автоматическим и нет необходимости проверять какие-либоtypeof

Например:

const foo = {
  a: true,
  b: {
    c: 42
  }
  d: 3
}

Может быть уменьшено до [1,42,3], и затем это может быть использовано в качестве ключа поиска для объекта, но для преобразованияэтот массив в строку в качестве ключа хеша не будет работать, потому что нет способа отличить его от [1,4,23]

Я пробовал предложения в алгоритме хеширования для логического значения переменного размерамассив , и это прекрасно работает, когда мой объект может поместиться в 32-разрядный массив TypedNumberArray - но как только мне понадобится несколько таких массивов и вызовет для них toString(), он станет медленным (все же намного быстрее, чем JSON.stringify, однако)

тЯзык arget - это javascript, хотя я рад видеть примеры кода на C или других языках, если это поможет.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Whups, глупая ошибка!как указал @ joseph-silber, запятые включены в Array.toString (), так что это не проблема.

Тем не менее - интересно посмотреть другие решения этой проблемы:)

0 голосов
/ 30 мая 2018

Как насчет этого?

class Lookup {
  constructor() {
    this.lookup = {}
  }

  insert(value) {
    if (!(value.a in this.lookup))
      this.lookup[value.a] = {}
    if (!(value.b.c in this.lookup[value.a]))
      this.lookup[value.a][value.b.c] = {}
    this.lookup[value.a][value.b.c][value.d] = value
  }
}

const l = new Lookup()
const foo = {
  a: true,
  b: {
    c: 42
  },
  d: 3
}
l.insert(foo)
console.log('l.lookup[true][42][3] =', l.lookup[true][42][3])

Вывод:

l.lookup[true][42][3] = { a: true, b: { c: 42 }, d: 3 }
0 голосов
/ 30 мая 2018

Если вы установите ключ поиска для фактических значений

var lookup = [true,42,3]

, вы можете использовать его как хеш-значение:

var values = {}
values[lookup] = foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...