Ваши два требования кажутся немного противоречивыми. Если последние 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";
Просьба уточнить - в другом комментарии вы говорите: «Я не пытаюсь создавать случайные значения Я пытаюсь разработать алгоритм, который может генерировать одно и то же значение из набора информации, который не всегда равен ». Это как раз противоположность «Учитывая некоторые значения, я хотел бы сделать уникальный результат». Если я не полностью упустил точку. – 2010-12-07 06:27:48
Хорошее решение зависит от распределения входных данных. Вероятно, лучше всего объяснить реальную проблему, которую вы пытаетесь решить. – jcd 2010-12-07 13:24:01