Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Подскажите по поводу закодированного идентификатора... / 16 сообщений из 16, страница 1 из 1
09.04.2008, 00:42
    #35244119
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по поводу закодированного идентификатора...
Привет!

Вобщем задали такую задачу - нужно кодировать идентификатор документа, т.е. нужно создавать некий цифро-кириллический код, в котором бы содержалась дата создания документа, номер документа, идентификатор создателя и еще несколько идентификаторов - типа номер склада, отдела и тп.
Заказчик просит чтобы код на выходе был небольшим, и был обратимым - т.е. проверяющий вводит код, а ему - все закоденные туда данные. Он, к примеру, сверяет и видит: накладная - подделка или нет.
Подскажите, мож кто такое решал уже.

спасибо.

вфп9
...
Рейтинг: 0 / 0
09.04.2008, 16:06
    #35245877
XAndy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по поводу закодированного идентификатора...
авторподделка или нет
Для этого обычно используют алгоритмы хэширования (crc32, sha, md5 и т.д.), если код на выходе нужен покороче, то возьмите crc32. Но все хэш-функции НЕобратимы! Из кода невозможно получить данные. Что касается желания вашего заказчика по поводу обратимости: в любой информации конечно есть какая-то избыточность, но не до такой степени, чтобы кучу идентификаторов сжать без потерь до одного. Подумайте сами, если бы такое было возможно, то зачем тогда сами данные, если можно хранить только такой чудо-идентификатор :)
...
Рейтинг: 0 / 0
11.04.2008, 00:23
    #35249875
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по поводу закодированного идентификатора...
да я-то ему первое что предложил это хэш, но знал что он необратим и его предупредил. И так же заметил, что при ТАКОМ кол-ве исходных данных маленький ключ никак не получается.
тем не менее у нас в городе есть СберБанки и когда у них плтишь квартплату, то в конце квинтанции очень похожий код печатается и всегда уникальный. У их прога написана на ФПД, но доступа ни к ней непосредственно, ни тем более к исходникам нет. Вот этот код как раз защищает от подделок этих квитанций. Мне не нужен именно их алго, мне свой подобный нужен. Вот например коды квитанций:

1л09щннтпкшсббх2ж9д4щи84
3ссзгсдщск7860щощ80чмйи3
ййо2аж9ткко84щинрол9рб5у

и тд, причем квитанции идут подряд, т.е. на одном листе...
...
Рейтинг: 0 / 0
11.04.2008, 16:05
    #35250279
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по поводу закодированного идентификатора...
Идентификаторы внутри цифровые или буквы есть? Буквы и даты к цифрам привести можно.

1. выстраиваешь все в строку 31125102357533302221244400255 - где каждый идентификатор: кол-во цифр и значение 112 => "3112", 251 => "51" и т.д.
2. делаешь какое-нибудь обратимое преобразование, например перетасовываешь цифры в хитром порядке или еще как. По сути этот алгоритм и даст криптостойкость твоему шифрованию. Можешь открытый-закрытый ключ использовать, но тогда длинный код в итоге будет.
3. Для уменьшения длины полученного переводишь частями в другую систему счисления например 62-х ричную (0-9, A-Z, a-z). Т.к. фокс точно работает только с 15-разрядными числами, то берешь 15 знаков. Например "311251023575333"
Переводишь обрезанное в 62-х ричную систему счисления:
311251023575333 => "1QNkQRL09"
запоминаешь кол-во знаков + строка => "91QNkQRL09" больше 9-ти не будет. Можешь "-" ставить.
4. Берешь следующие 15 и к п.3

Раскодировать в обратном порядке.

Когда-то делал конвертацию 62-10:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
func Conv10to62
lpara tnValue
local lcRet, lnCifra
lcRet=""
do while tnValue> 0 
   lnCifra=tnValue-int(tnValue/ 62 )* 62 
   tnValue=int(tnValue/ 62 )
   do case
      case lnCifra< 10 
           lcRet=chr(lnCifra+ 48 )+lcRet
      case lnCifra< 36 
           lcRet=chr(lnCifra+ 55 )+lcRet
      otherwise
           lcRet=chr(lnCifra+ 61 )+lcRet
   endcase
enddo
return lcRet


func Conv62to10
lpara tcValue
local lnRet, lnCifra
lnRet= 0 
do while !empty(tcValue)
   lnCifra=asc(tcValue)
   tcValue=substr(tcValue, 2 )
   do case
      case lnCifra< 58 
           lnRet=lnRet* 62 +lnCifra- 48 
      case lnCifra< 91 
           lnRet=lnRet* 62 +lnCifra- 55 
      otherwise
           lnRet=lnRet* 62 +lnCifra- 61 
   endcase
enddo
return lnRet
Можешь русские буквы взять, тогда 74-х ричная система счисления будет 10+32+32

Можешь генератор случайных чисел задействовать для добавления ненужной инфы, которая разнообразит даже одинаковые записи. Например брать не 15 а 14 и первый знак случайное число от 1-9. Обязательно первый, т.е. старший разряд.

Контрольный разряд добавь, чтобы ошибки оператора отлавливать.
...
Рейтинг: 0 / 0
11.04.2008, 16:10
    #35250300
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по поводу закодированного идентификатора...
Можно не 15 брать, а прикинуть чтобы примерно равные части получились. Например у тебя 38 всего, т.е. 15+15+8 => 13+13+12 и записывать через "-". Руками вводить удобней будет с "-"
...
Рейтинг: 0 / 0
11.04.2008, 16:15
    #35250314
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по поводу закодированного идентификатора...
Большое спасибо!

буду переваривать :)
...
Рейтинг: 0 / 0
11.04.2008, 16:29
    #35250364
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по поводу закодированного идентификатора...
Еще подумал:
1. Контрольный разряд не обязательно он уже есть, когда обратно будешь преобразовывать п.1 ("3112" => 112) проверяй что нулевой длины и недостающих символов не оказалось.
2. Если руками код набирать будут, то лучше только большие русские буквы использовать, иначе SHIFT давить надо будет, что потребует больше времени для набора.
...
Рейтинг: 0 / 0
12.04.2008, 08:10
    #35251200
Dag
Dag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по поводу закодированного идентификатора...
Может пригодится эта ссылка.
http://]www.foxclub.ru/sol/solution181.php
...
Рейтинг: 0 / 0
15.04.2008, 17:49
    #35257013
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по поводу закодированного идентификатора...
Я тут придумал на основе предложенного кода такое дело - во-первых я не стал опираться на коды символов, я сделал иначе - создаю строку-ключ, длиной, скажем 20 уникальных символов (к примеру буквы не в алфавитном порядке), а потом нужный с помощью SUBSTR() и АТ() вытягиваю. А случайное число, можно добавить в начало (задумав его длину фиксированной), и его, скажем при кодировании к каждому числу добавить, ну а потом отнять - вот тебе и уникальность одного и того же набора чисел!
И еще такая идея есть, слизанная с системы ид. кодов - представлять дату как число в виде разницы от определенной даты. К примеру от 2к, своего д/р или д/р жены, родаков, Che Gue Varda, Ленина, короче от любой даты :)
...
Рейтинг: 0 / 0
15.04.2008, 18:10
    #35257094
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по поводу закодированного идентификатора...
CTAC-KOЯ тут придумал на основе предложенного кода такое дело - во-первых я не стал опираться на коды символов...
Преобразование из одной системы счисления в другу похоже осилил. А это самый эффективный способ уменьшить кол-во символов.
...
Рейтинг: 0 / 0
15.04.2008, 18:32
    #35257150
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по поводу закодированного идентификатора...
Dima TПреобразование из одной системы счисления в другу похоже осилил. А это самый эффективный способ уменьшить кол-во символов.
Опечатка вышла ... хотел не осилил написать
...
Рейтинг: 0 / 0
16.04.2008, 10:39
    #35258010
XAndy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по поводу закодированного идентификатора...
CTAC-KO
В сбербанке том наверняка банальное преобразование цифр в 10+33=43-ричную систему исчисления
...
Рейтинг: 0 / 0
16.04.2008, 11:28
    #35258196
Подскажите по поводу закодированного идентификатора...
CTAC-KOПривет!

Вобщем задали такую задачу - нужно кодировать идентификатор документа, т.е. нужно создавать некий цифро-кириллический код, в котором бы содержалась дата создания документа, номер документа, идентификатор создателя и еще несколько идентификаторов - типа номер склада, отдела и тп.
Заказчик просит чтобы код на выходе был небольшим, и был обратимым - т.е. проверяющий вводит код, а ему - все закоденные туда данные. Он, к примеру, сверяет и видит: накладная - подделка или нет.
Подскажите, мож кто такое решал уже.

спасибо.

вфп9
А штрих-кодирование не подойдет? Там обычно предусмотрен контрольный разряд (или даже два) для контроля правильности формирования кода... Инфы по различным штрих-кодам в Инете много...
Кроме того, можно сделать двумерное штрих-кодирование (некоторые банки используют, выглядит как "размазанная" квадратная печать; сейчас вроде на акцизных марках такое тоже практикуется)...
...
Рейтинг: 0 / 0
22.04.2008, 09:47
    #35270283
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по поводу закодированного идентификатора...
Dima T Dima TПреобразование из одной системы счисления в другу похоже осилил. А это самый эффективный способ уменьшить кол-во символов.
Опечатка вышла ... хотел не осилил написать
ну не знаю, может просто непонятно выразилсо... система моя, такая же по сути как и предложенная Вами. Вы же каждое число из своей хх-ричной системы представляете в виде символа, так ведь? В этом же и суть, т.е. буква "Я" у Вас будет числом 43. Ну вот и я точно так же. Только в Вашем случае идет по ходу acsii, а в моем - нет, т.е. 43 у меня может быть буква "И". Кроме всего прочего, благодаря такой системе я могу кастомизить такие вещи как "ш" и "щ" - похожи по виду, правда? А зачем путаница в недогляделках? А я взял и букву "щ" исключил - просто стер ее из строки. То же самое с "ъ/ь". Ну меньше разрядов вышло, не 43, а 39 (и/й, и е/ё), за то исключаю возможные ашипки (typo).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
FUNCTION Conv10to39
LPARAMETERS tnValue
LOCAL lcResult, lnRest, lcKey
lcKey = '0цуке1нгшзх2фывап3ролджэ4я5ч6с7мит8ь9бю'
lcResult = ''
DO WHILE m.tnValue >  0 
   *lnRest = m.tnValue - int(m.tnValue/ 39 )* 39 
   lnRest = MOD(m.tnValue, 39 )
   tnValue = INT(m.tnValue/ 39 )
   lcResult = SUBSTR(m.lcKey,m.lnRest+ 1 , 1 ) + m.lcResult
ENDDO
RETURN m.lcResult
...
Рейтинг: 0 / 0
22.04.2008, 17:10
    #35272082
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по поводу закодированного идентификатора...
CTAC-KO[quot Dima T]ну не знаю, может просто непонятно выразилсо...
Похоже на то. Значит осилил :)
...
Рейтинг: 0 / 0
25.04.2008, 13:03
    #35279690
CTAC-KO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по поводу закодированного идентификатора...
Станислав С...кийА штрих-кодирование не подойдет? ваще-то подойдет, вернее юзать планирую, но в другом месте.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Подскажите по поводу закодированного идентификатора... / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]