ФорумПрограммированиеPHP для идиотов → Суррогатный ключ на основе 3-х полей

Суррогатный ключ на основе 3-х полей

  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 24 мая 2011 г. 9:21

    Есть объекты и есть, соответственно, у них objectId. От 1 и, допустим, до 100000.
    У каждого объекта есть цена, которая меняется каждый день. То есть у нас есть цены для каждого объекта на, пусть, 90 дней вперёд.
    Кроме того, у каждого объекта может быть до 3-х вариантов цены.

    Хотим запихать все эти цены в Sphinx в виде документов:
    objectId
    variant
    date
    price

    PRIMARY KEY для подобного документа, это, очевидно, (objectId, variant, date).
    Но в Sphinx нет составных ключей, нужен уникальный document_id.

    То есть нужно на основании трёх полей сделать уникальный суррогатный 32-битный ключ, однозначно определяющийся этими тремя полями.

    Как?

    Просто в md5 загнать - слишком большое число.
    Можно разделить на куски по 8 символов и сложить их:

    $key = $objectId.'_'.$variant.'_'.$date;
    $key = md5($key);
    $key = str_split($key, 8);
    foreach ($key as &$v) {
    $v = hexdec($v);
    }
    $documentId = array_sum($key);


    Нихуя - коллизии лезут, если размер куска меньше 9.
    >= 9 - числа больше 32-бит получаются.

    crc32 нихуя не помогает.

    Хуле делать?
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 24 мая 2011 г. 9:26, спустя 5 минут 10 секунд

    зачем складывать куски?
    в каком формате дата?
    не всё полезно, что в swap полезло
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 24 мая 2011 г. 9:28, спустя 1 минуту 36 секунд

    Как вариант хранить в разрядах числа. То есть 32 разряда, первые 12 выделить под дату, следующие 15 под objectId и т.д.
    Но как-то через жопу и даты придётся хранить, как количество дней от, допустим, 1 января 2010.
    Спустя 80 сек.
    зачем складывать куски?

    Целый md5 - большой. По всякому резать надо, а дальше либо складывать, либо использовать только один из них.

    в каком формате дата?

    сейчас timestamp пробовали, но можно в любой удобный перевести.
  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 24 мая 2011 г. 9:40, спустя 12 минут 6 секунд

    т.е. нужно что то сделать с набором 100000 15800,20 20100101 ? как насчет пересести в дроичную и сжать?
    Спустя 44 сек.
    ебать я посоветовал хуйню )))
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 24 мая 2011 г. 9:47, спустя 6 минут 42 секунды


    Нихуя - коллизии лезут, если размер куска меньше 9.
    >= 9 - числа больше 32-бит получаются.

    crc32 нихуя не помогает.

    Хуле делать?
    +111!!! блеать!
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 24 мая 2011 г. 9:50, спустя 3 минуты 14 секунд

    Как вариант хранить в разрядах числа. То есть 32 разряда, первые 12 выделить под дату, следующие 15 под objectId и т.д.
    Но как-то через жопу и даты придётся хранить, как количество дней от, допустим, 1 января 2010.

    так
    не всё полезно, что в swap полезло
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 24 мая 2011 г. 9:52, спустя 2 минуты 13 секунд

    Morton Interleave
    Спустя 70 сек.
    http://aidanlister.com/2010/11/interleaving-numbers/

    хз, может быть это можно применить к твои 3 ключам. ты же умный
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 24 мая 2011 г. 10:00, спустя 8 минут 31 секунду

    можно вопрос - нахуй надо? покажите чо вы дальше хотите делать? может проблема в подходе?
    Спустя 86 сек.
    зы: я только проснулся, кому ненравится имеет шанс быть забанен блеядь
    Сапожник без сапог
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 24 мая 2011 г. 10:01, спустя 7 секунд


    можно вопрос - нахуй надо? покажите чо вы дальше хотите делать? может проблема в подходе?
    дальше, зная эти три параметра мне нужно будет получить этот id.
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 24 мая 2011 г. 10:01, спустя 36 секунд

    другой вариант - изначально делать систему так, чтобы коллизии её не пугали. хеш с коллизиями это нормально
    ιιlllιlllι унц-унц
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 24 мая 2011 г. 10:02, спустя 1 минуту 12 секунд


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

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 24 мая 2011 г. 10:03, спустя 26 секунд

    дальше, зная эти три параметра мне нужно будет получить этот id.

    если вы их заранее знаете, то создайте словарь по ним да и все … ну и id'ы раздайте …
    Сапожник без сапог
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 24 мая 2011 г. 10:05, спустя 1 минуту 52 секунды


    дальше, зная эти три параметра мне нужно будет получить этот id.

    если вы их заранее знаете, то создайте словарь по ним да и все … ну и id'ы раздайте …
    невариант… негде хранить это говно.
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 24 мая 2011 г. 10:11, спустя 6 минут 8 секунд

    негде хранить это говно.

    что сложного сохранить словарь ? там даже выборка не нужна насколько я понял
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 24 мая 2011 г. 10:15, спустя 4 минуты 2 секунды

    я наверное тупой. что мешает сделать еще одно поле и считать его primary key?

    id autoinc
    objectId
    variant
    date
    price

    ιιlllιlllι унц-унц

Пожалуйста, авторизуйтесь, чтобы написать комментарий!