|
как закодировать Наименование в Артикул? | ☑ | ||
---|---|---|---|---|
0
D_Pavel
29.11.11
✎
11:05
|
Нужно получить артикул из наименования товара, чтобы в нем не встречались всякие нехорошие символы, и желательно укоротить, и чтобы он был с большой вероятностью уникальным (при условии что наименование уникально).
По артикулу будут назначаться имена файлам, эти файлы будут в интернете, потому наименования не подходят, т.к. в них могут встречаться русские буквы, всякие кавычки и другой мусор. Как бы такое сделать? |
|||
1
andrewks
29.11.11
✎
11:05
|
MD5
|
|||
2
Wobland
29.11.11
✎
11:06
|
ГСЧ=Новый ГенераторСлучайныхЧисел...
|
|||
3
GROOVY
29.11.11
✎
11:06
|
Используй функцию "ЗакодироватьНаименованиеПоХитрому()"
|
|||
4
Жан Пердежон
29.11.11
✎
11:06
|
хэширование
|
|||
5
Ненавижу 1С
гуру
29.11.11
✎
11:06
|
создать хеш-функцию, на входе строка, на выходе число
вероятность одинаковых значений при разных наименованиях больше 0 |
|||
6
mikecool
29.11.11
✎
11:07
|
(0) тупо используй артикул с латиницей )
|
|||
7
PR
29.11.11
✎
11:07
|
(0) Зачем?
Что мешает просто генерить новый артикулдля каждой номенклатуры? |
|||
8
Ненавижу 1С
гуру
29.11.11
✎
11:08
|
static void Main(string[] args)
{ string s = "Клавиатура Genius KB-06XE проводная"; Console.WriteLine(s.GetHashCode()); //566656636 Console.ReadKey(); } |
|||
9
rs_trade
29.11.11
✎
11:09
|
(7) как то слишком просто.
|
|||
10
shuhard
29.11.11
✎
11:09
|
(0) что мешает использовать в качестве артикула код номенклатуры ?
|
|||
11
rutony
29.11.11
✎
11:11
|
(0) А не проще использовать код номенклатуры??
или не... давайте изобретем велосипед)) |
|||
12
kosts
29.11.11
✎
11:12
|
Наименование = Наименование + ссылка.УникальныйИдентификатор()
|
|||
13
D_Pavel
29.11.11
✎
11:17
|
Код и генератор случайных чисел не подходят, потому что нет зависимости от наименования.
Если удалить товар и заново его создать с тем же наименованим, нужно чтобы артикул создался какой был. |
|||
14
Жан Пердежон
29.11.11
✎
11:20
|
(13) используй РС тогда, в нем храни соответствие наименования и артикула
|
|||
15
D_Pavel
29.11.11
✎
11:23
|
(1)как MD5 сгенерировать?
|
|||
16
kosts
29.11.11
✎
11:26
|
(13) Какова вероятность создать новый товар с наименованием идентичным старому...
А пробелы, а регистр букв, и т.п... |
|||
17
Жан Пердежон
29.11.11
✎
11:26
|
(16) 100%
хочешь создам?) |
|||
18
D_Pavel
29.11.11
✎
11:29
|
(16) Товар загружается из прайса поставщика, наименование всегда идентично старому.
|
|||
19
Romcheg
29.11.11
✎
11:30
|
Написать функцию ВЛатиницуИУдалитьНахСпецСимволы()
|
|||
20
acsent
29.11.11
✎
11:31
|
Зачем кодировать? Просто перенумеровать и все
|
|||
21
Eugene_life
29.11.11
✎
11:35
|
(0) Создать таблицу кодировки Слог -> Число. Закодировать так номенклатуру. Пропить премию.
|
|||
22
Ненавижу 1С
гуру
29.11.11
✎
11:37
|
(21) прикольный будет РС
|
|||
23
D_Pavel
29.11.11
✎
11:38
|
А умные мысли есть у кого?
|
|||
24
Lama12
29.11.11
✎
11:39
|
(0)Хэш функции всегда имеют коллизии.
Что б однозначно закодировать в артикул наименование, артикул должен быть той же длины что и наименование. Допустим у тебя для наименования используется 2 символа алфавита, и длина наименования 5 знаков. Тогда количество вариантов - 2^5. Исходя из этого определи: сколько у тебя символов в алфавите, какова длина наименования. Сколько символов в алфавите которым ты будешь пользоваться для создания артикула. Какова длина артикула. На основании этих данных получишь количество комбинаций в наименовании и количество комбинаций в артикуле. Далее используя систему счисления с основанием равным длине алфавита, можно закодировать артикул. НО! Это теория, хоть и верная и дающая однозначные результаты, но теория. На практике сделал бы проще. Вместе с файлами о номенклатуре выгружал бы отдельный служебный файл соответствий. В котором одна колонка - код, вторая наименование номенклатуры. Вот и все. |
|||
25
el-gamberro
29.11.11
✎
11:42
|
Я бы сделал бы отдельную таблицу артикулов и не парил бы моск.
Хранить данные всегда выгоднее чем вычислять |
|||
26
Lama12
29.11.11
✎
11:46
|
Ииии...
Автор, какое решение? |
|||
27
rs_trade
29.11.11
✎
12:02
|
(26) Хранить соответствие в РС. Одно измерение Наименование, один ресурс Артикул. Если наименования нет, добавлять запись и назначать артикул. Если есть, получать артикул.
|
|||
28
el-gamberro
29.11.11
✎
12:23
|
(27) Илегантное решение.
|
|||
29
D_Pavel
29.11.11
✎
12:33
|
(26) пока ничего не буду делать. Всё хреново.
|
|||
30
Lama12
29.11.11
✎
12:35
|
(29) Хм.. :(
Печаль. |
|||
31
D_Pavel
29.11.11
✎
12:39
|
Пока такой вариант на первом месте: Сложить все коды символов наименования, полученное число считать артикулом.
|
|||
32
D_Pavel
29.11.11
✎
12:57
|
Для й = 1 по СтрДлина(Наименование) цыкл
Артикул = Артикул + КодСимвола(Наименование, й); КонецЦыкла; |
|||
33
Eugene_life
29.11.11
✎
13:03
|
(32) Отличная бомба замедленного действия. Главное - непонятно, когда рванет :D Вполне вероятно, что артикулы от какого-нить "абабабабаба" окажется равен по сумме "щю".
|
|||
34
D_Pavel
29.11.11
✎
13:08
|
(33) Чтобы уменьшить эту вероятность, ввел влияние позиции символа в строке:
АртикулНаш = 0; Для й = 1 по СтрДлина(Наименование) цикл АртикулНаш = АртикулНаш + КодСимвола(Наименование, й) * Pow(2, й); КонецЦикла; |
|||
35
AlexSvt
29.11.11
✎
13:20
|
+ (33) Именно так и будет.
(34) Какое количество номенклатуры предполагается обрабатывать? Проверил на своем справочнике - при 34318 элементов количество разных кодов: - 17455 (только код символа) - 24942 (с учетом Pow(2, й)) |
|||
36
Eugene_life
29.11.11
✎
13:26
|
(34) А, может, просто при создании номенклатуры генерить уникальную последовательность символов, и хранить ее в реквизите? С контролем уникальности по всему справочнику, но с возможностью ручного редактирования? Создал номенклатуру, 1С сгенерила случайную последовательность, по необходимости ее подправил. И все. Тебе же все равно не нужна прозрачная связь между кодом и названием.
|
|||
37
D_Pavel
29.11.11
✎
13:33
|
(35) из 2636 позиций 73 совпадения. Хреново. Желательно не больше 5
|
|||
38
y88
29.11.11
✎
13:42
|
(37) ну добавь еще кол-во символов
|
|||
39
D_Pavel
29.11.11
✎
13:43
|
(38) так и делаю
|
|||
40
y88
29.11.11
✎
13:44
|
(39) попробуй подели на кол-во символов :)
|
|||
41
D_Pavel
29.11.11
✎
13:45
|
(37) Ой, наверное это группы попали, у них артикул пустой, потому и совпадения.
|
|||
42
D_Pavel
29.11.11
✎
13:45
|
(40) этого делать точно не нужно, только увеличится вероятность повтора
|
|||
43
MSOliver
29.11.11
✎
13:50
|
"Наименование"+УникальныйИдентификатор()
|
|||
44
kosts
29.11.11
✎
14:19
|
Вот удобный вариант с промежуточным хранением.
Создаешь новый справочник. При добавлении номенклатуры делаешь по нему поиск по наименованию. Нашел - Артикул = его уникальный идентификатор. Не нашел. Добавляешь. Присваиваешь наименование.Записываешь и смотришь его уникальный идентификатор. При удалении номенклатуры в основном справочнике в дополнительном не удаляешь никогда. |
|||
45
karakusek
29.11.11
✎
14:51
|
(44) А почему нельзя это сделать в регистре?
Как предлагалось в (25) |
|||
46
kosts
29.11.11
✎
14:53
|
(45) Просто вариант. Система сама генерирует код.
|
|||
47
D_Pavel
30.11.11
✎
07:39
|
в таком варианте совпадений не произошло при 2636 элементах:
Артикул = ""; Для й = 1 по СтрДлина(Наименование) цикл Артикул = Артикул + Символ(КодСимвола(Наименование, й) % 25 + 65); КонецЦикла; |
|||
48
D_Pavel
30.11.11
✎
08:00
|
(2) Хороший вариант, кстати.
|
|||
49
Rie
30.11.11
✎
08:03
|
(0) А делай так, как имя файла 8.3 строится из полного имени.
|
|||
50
D_Pavel
30.11.11
✎
08:03
|
(8) это как в 1С запихать?
|
|||
51
Rie
30.11.11
✎
08:05
|
(50) :-)
Напиши свою функцию хеширования. Или возьми в качестве артикула УникальныйИдентификатор. |
|||
52
D_Pavel
30.11.11
✎
08:27
|
на инфостарте хорошую функцию хеширования нашел. Совпадений 0, длина артикула не большая! ))))
|
|||
53
D_Pavel
30.11.11
✎
08:35
|
В итоге вот что получилось:
Хэш = 0; Для й = 1 по СтрДлина(Наименование) цикл Хэш = 31 * Хэш + КодСимвола(Наименование, й); КонецЦикла; Хэш = Хэш % 18446744073709551616; База = 25; Артикул = ""; Пока Хэш <> 0 Цикл Артикул = Символ(65 + Хэш % База) + Артикул; Хэш = Цел(Хэш / База); КонецЦикла; Такие артикулы выдает: WAHMHFGBAQXCK WAHMHFGBAQXDG WAHMHFGBAQXQW WAHMHFGBAQYQH WAHMHFGBAQYQM WAHMHFGBAQYQR WAHMHFGBAQYQT FFMIUHYTEAGQWW FFMIUHYTECEGUC FFMIUHYTECEIIN KXTAOUATDWTQPR KXTAOUATDWTQQX KXTAOUATDWTQRL KXTAOUATDWWUCH KXTAOUATDWWUFS KXTAOUATISJAXN KXTAOUATISJAYB KXTAOUATISJBAH KXTAOUATISJBCG |
|||
54
Эмбеддер
30.11.11
✎
08:36
|
(53) Респект! Особенно удобно по сравнению с цифрами диктовать по телефону
|
|||
55
D_Pavel
30.11.11
✎
08:44
|
+(53) первый абзац дает десятеричный цифровой хеш, второй абзац перекодирует его в двадцатипятиричный буквенный что дает сокращение длины.
|
|||
56
aleks-id
30.11.11
✎
08:45
|
(55) найди функцию CRC32 (тут бегала на форуме) и не парь моск
|
|||
57
Рэйв
30.11.11
✎
08:51
|
(0)Тупо замени буквы на КодСимвола() тогда из наименования будет всегда один артикул
|
|||
58
Эмбеддер
30.11.11
✎
08:55
|
(55) Так можно и до байта дойти.
вообще чтобы уменьшить вероятность совпадения артикулов в 2 раза, наименование преобразовать через ВРег |
|||
59
0xFFFFFF
30.11.11
✎
08:57
|
(0) Код символа используй. Но "число-строка" будет оооочень большим. В 3 раза больше оригинала.
|
|||
60
Мимохожий Однако
30.11.11
✎
08:57
|
(0)Ну, создал ты артикул из наименования и как это потом будешь использовать? Не понятно. Если поиск, то достаточно по наименованию, тем более что наименование в прайсе поставщика не меняется. Если хочешь оставить своё наименование, то заведи дополнительный реквизит и в него забрось наименование поставщика. Зачем эти шифрования и т.п.?
|
|||
61
Umka2008
30.11.11
✎
08:59
|
А код не предлагать?
|
|||
62
Эмбеддер
30.11.11
✎
09:02
|
Если проблема в именах файлов в интернете, то это не проблема, пробел выглядит как %20
|
|||
63
D_Pavel
30.11.11
✎
09:13
|
(58) если использовать ВРег, вероятность совпадения увеличится
(60) Это для интернета, в (0) написано (62) проблема в людях которые администрируют сайт. У них оплата не сдельная, а по окладу. Не хотят делать поддержку русских букв и проверку на плохие символы. |
|||
64
Эмбеддер
30.11.11
✎
09:15
|
(63) Щас я пример придумаю
|
|||
65
Эмбеддер
30.11.11
✎
09:19
|
например, у тебя вообще "12" и "0Q" даст один и тот же результат.
надо чтобы если уж ты умножаешь на 31, то и диапазон значений должен быть от 0 до 30 |
|||
66
D_Pavel
30.11.11
✎
09:20
|
(64) например: товары Золупа и ЗОЛУПА будут иметь одинаковый артикул если использовать ВРег.
|
|||
67
D_Pavel
30.11.11
✎
09:21
|
(65) может тогда на 25 умножать?
|
|||
68
Эмбеддер
30.11.11
✎
09:23
|
Нет, умножать на 256.
Если сделаешь ВРег, сможешь умножать на (256-33-26). |
|||
69
Эмбеддер
30.11.11
✎
09:24
|
ну и тогда придется сдвигать коды чтобы не было пропусков, иначе (65) произойдет все равно
|
|||
70
D_Pavel
30.11.11
✎
09:25
|
(69) встречаются наименования и с кодом символа 7, диапазон большой. Сдвигать сильно не получится.
|
|||
71
D_Pavel
30.11.11
✎
09:26
|
(68) если умножать на 256 получится та же самая строка.
|
|||
72
Эмбеддер
30.11.11
✎
09:27
|
(70) например если нам нужно убрать все символы до пробела и восклицательный знак, то замена такая 31->0, 32->1, 34->2 и т.п.
|
|||
73
D_Pavel
30.11.11
✎
09:29
|
Я понял, ты хочешь предложить вариант без потери информации, но меня устроит просто с небольшой вероятностью повторов. 0.1% вполне годится.
|
|||
74
Эмбеддер
30.11.11
✎
09:31
|
(73) Потеря все равно будет когда делишь на 18446744073709551616, это не сильно плохо, но в твоем варианте из-за (65) повторов будет гораздо больше, чем если посчитать хэш стандартным способом
|
|||
75
D_Pavel
30.11.11
✎
09:33
|
(74) Не думаю что это верно. Согласен что повторов будет больше до деления на 18446744073709551616, но если предположить что почти всегда число получается больше чем 18446744073709551616 (длинное наименование), то после деления количество повторов должно быть одинаковым.
|
|||
76
D_Pavel
30.11.11
✎
09:36
|
Ты вот в чем прав: Если умножать на 256, а не на 31, то увеличивается вероятность что результат будет больше 18446744073709551616, это хорошо.
|
|||
77
D_Pavel
30.11.11
✎
09:37
|
хотя у меня и так при 2636 позициях не было ни одного совпадения.
|
|||
78
Эмбеддер
30.11.11
✎
09:45
|
(75) Если произошел повтор до деления, то после деления результат будет тот же (т.е. все равно повтор)
(77) Конечно можно оставить и так |
|||
79
AlexSvt
30.11.11
✎
11:21
|
(77) повторил тест, для варианта (47) получаем 32002 различных артикула для 34318 наименований, для варианта (53) - 32016.
|
|||
80
Reset
30.11.11
✎
11:34
|
Из уточнения в (13) прямо следует единственное решение в (14).
"0.1% вполне годится" - каждый примерно тысячный товар будет перепутан с другим, и это устраивает? бред же |
|||
81
Reset
30.11.11
✎
11:34
|
(80) про 0.1% - к посту в (74)
|
|||
82
Reset
30.11.11
✎
11:35
|
73 то есть, черт
|
|||
83
AlexSvt
30.11.11
✎
11:48
|
+(79) последний тест: 31962 различных артикулов для 31962 наименований.
|
|||
84
D_Pavel
30.11.11
✎
14:02
|
(80) Почему бред? Не у каждого товара будет привязан файл с картинкой, и с вероятностью 0.1% картинка будет не соответствовать товару, ну и фиг с ней, никто даже не заметит.
(83) это для какого варианта? |
|||
85
AlexSvt
01.12.11
✎
11:29
|
(84) для варианта (53)
|
|||
86
D_Pavel
01.12.11
✎
11:40
|
(85) Значит хороший вариант.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |