2010-12-06 6 views
1

Учитывая некоторые значения, я хотел бы сделать уникальный результат (довольно чертовски).Создать уникальный идентификатор из нескольких значений с отказоустойчивостью

$unique1 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8', '0plnmjfys')); 
//now $unique1 == "sqef3452y"; 

Мне также нужно что-то довольно близкое к возврату того же результата. В этом случае 20% значений отсутствует.

$unique2 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8')); 
//also $unique2 == "sqef3452y"; 

Я не уверен, с чего начать с такого алгоритма, но у меня есть некоторые предположения.

  1. Я полагаю, что чем больше значения, приведенные, тем точнее полученный ID - другими словами, с использованием 20 значений лучше, чем 5.
  2. Я также предположить, что фактор доверия может быть рассчитана и отрегулирована.

Что было бы неплохо иметь весовой коэффициент, где можно сказать, что значение 1 более важно, чем значение 3. Для этого потребуется многомерный массив для ввода вместо одного измерения.

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

+0

Просьба уточнить - в другом комментарии вы говорите: «Я не пытаюсь создавать случайные значения Я пытаюсь разработать алгоритм, который может генерировать одно и то же значение из набора информации, который не всегда равен ». Это как раз противоположность «Учитывая некоторые значения, я хотел бы сделать уникальный результат». Если я не полностью упустил точку. – 2010-12-07 06:27:48

+0

Хорошее решение зависит от распределения входных данных. Вероятно, лучше всего объяснить реальную проблему, которую вы пытаетесь решить. – jcd 2010-12-07 13:24:01

ответ

1

Ваши два требования кажутся немного противоречивыми. Если последние 20% массива несущественны (т. Е. Вы хотите получить тот же результат, если он равен «0plnmjfys» или он равен нулю), то почему вы хотите включить его в первую очередь?

Первый шаг заключается в том, чтобы уточнить, что вы хотите устранить. Если это не важно, просто снимите его.

Как только вы решили это, вы должны спросить себя, ожидаете ли вы, что два «близких» результата будут иметь «близкие» идентификаторы ... т. Е.может быть, вы хотите

$unique1 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8', '0plnmjfys')); 
//now $unique1 == "sqef3452y"; 

$unique1 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8', '0plSsa45')); 
//now $unique1 == "sqef3452k"; 

Последняя сложнее, потому что большинство уникальных генераторов идентификаторов использовать hashes (вы можете посмотреть их, тоже), так что две очень похожие строки могут вернуться дико разные результаты.

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

Если вы хотите привилегировать «близость», вы можете рассчитать хеши для наиболее подходящих частей и применить Soundex algorithm или что-то подобное для остальных менее важных частей.

Просто помните, что у вас есть противоречащие друг другу требования: Уникальные идентификаторы стараются очень трудно дать (дико) разные коды для строк, даже если единственная разница в одном символе в строке 1000 символов.

Закрытость (эта строка «более или менее то же самое», как эта вторая строка) пытается сделать прямо противоположное, и мы надеемся вернуться тот же код для двоих: цитирую Википедию об алгоритме Soundex:

Используя этот алгоритм, оба «Роберт» и «Руперт» возвращают ту же строку «R163», а «Рубин» - «R150». «Ashcraft» и «Ashcroft» оба дают «A261».

Итак ... что это? Считаете ли вы, что использование хэшей для первых 4 элементов (в вашем примере) и Soundex для наименее значимых 20% в вашем примере работает?

Это, вероятно, приведет (возвращаясь к вашему примеру) в чем-то вроде:.

$unique2 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8',)); 
//now $unique2 == "AB67R45-000000"; 

$unique1 = generate(array('ab034', '981kja7261', '381jkfa0', 'vzcvqdx2993883i3ifja8', '0plSsa45')); 
//now $unique2 == "AB67R45-012000"; 
0

Предлагаю вам ознакомиться с генераторами случайных чисел (RNG), семенами и степенями случайности.

В общем, большинство программных RNG используют значение, называемое «семя», для инициализации алгоритма. После этого каждое генерируемое случайное число используется как семя для следующей итерации. Это означает, что если вы всегда используете одно и то же семя (например, 1 или 42), вы всегда будете получать одну и ту же последовательность «случайных» чисел. Таким образом, эти типы ГСЧ часто называются только «псевдослучайными». В целях безопасности значение семени часто выбирается с использованием чего-то вроде текущего системного времени в миллисекундах или устройства аппаратной рандомизации, чтобы уменьшить вероятность выбора одного и того же семени в течение разумного периода времени.

Что вы предлагаете, это RNG, который может принимать несколько строк, возможно с весами, и использовать некоторую формулу для вычисления семени. Затем вы используете свой сеянный RNG для случайного выбора символов для создания новой строки. Это интересно, но, к сожалению, это не будет действительно более значимо более случайным, чем просто начиная с численного семени и существующего RNG, как описано выше. Хотя это может быть весело, как упражнение!

http://en.wikipedia.org/wiki/Random_number_generation

Вы можете также Google «случайная строка генератор» или некоторые такие, чтобы найти больше ресурсов на создание случайных строк.

+0

Я не пытаюсь создать случайные значения. Я пытаюсь разработать алгоритм, который может генерировать одно и то же значение из набора информации, который не всегда равен. – ojreadmore 2010-12-06 17:31:06

Смежные вопросы