Имя: Пароль:
1C
 
Что это за UUID вида YsEgMwVEh4mwuHax? И как его генерить?
, ,
0 Гений 1С
 
гуру
24.06.20
11:31
Что это вообще за UUID? Используется в интернет-магазинах типа Мегашоп.
Я так понимаю 16 случайных букв из алфавита 01...9A..Za...z. Т.е. система счисления 74-ричная.
Этот идентификатор шире GUID. Но наверное просто 16 случайных цифр - это ненадежно.
Надо его генерить из GUID, наверное, где тоже 16 знаков, но система счисления 16-ричная.

Как правильно сгенерить такой UUID, собственно? Просто сгенерить GUID и конвертануть его в 74-ричную систему счисления?
1 Гений 1С
 
гуру
24.06.20
11:34
т.е. сайты типа Megagroup, пардон
2 acht
 
24.06.20
11:35
Убийцу Megagroup проектируешь?
3 RomanYS
 
24.06.20
11:35
(0) Используй просто GUID без конвертации
4 АНДР
 
24.06.20
11:35
Почему не ограничиться 1Совским, если он - подмножество?
5 d4rkmesa
 
24.06.20
11:38
(0) Судя по описанию обмена megagroup, можно просто (3) .
6 acht
 
24.06.20
11:49
(0) > Этот идентификатор шире GUID.

GUID = 128 бит, 32 позиции  по 16 вариантов = 16^32 вариантов = 3.4028237e+38  
Этот идентификатор = 16 символов по 74 варианта = 74^16 вариантов = 8.0855118e+29

3.4028237e+38 > 8.0855118e+29

Ну так, для образования
7 Гений 1С
 
гуру
24.06.20
11:54
(3) (4) Блин, коллеги, точняк. че-то я туплю с утра. можно просто ГУИД юзать, точно.
8 Гений 1С
 
гуру
24.06.20
11:54
(2) не, обмен с Megagroup для клиента пилю по схеме: https://v8.1c.ru/tekhnologii/obmen-dannymi-i-integratsiya/standarty-i-formaty/protokol-obmena-s-saytom/
9 Гений 1С
 
гуру
24.06.20
12:48
А, блин, засада. GUID то имеет длину 32 символа....
10 RomanYS
 
24.06.20
12:49
(9) отрежь половину
11 Полован
 
24.06.20
13:02
(9) Пилять.. Сделай хэш GUID и не капай людям на мозги.
12 RomanYS
 
24.06.20
13:05
(0) интересно, а откуда вообще "74ричная" взялась?
10+2*26=62
13 Гений 1С
 
гуру
24.06.20
13:06
(12) да, пардон. че-то 32 буквы посчитал
14 Serginio1
 
24.06.20
13:39
(9) https://ru.wikipedia.org/wiki/GUID  это 16 байт. 32 это Hex представление/
Похоже на Base64 https://ru.wikipedia.org/wiki/Base64
15 Гений 1С
 
гуру
24.06.20
13:45
(14) да, точно, похоже на Base64, спасибо.
16 Гений 1С
 
гуру
28.09.20
13:37
Короче, в итоге сделал так:

Функция СгенерироватьUUID() Экспорт
    АлфавитUUID = "0123456789"
    + "abcdefhgijklmnopqrstuvwxyz"
    + "ABCDEFHGIJKLMNOPQRSTUVWXYZ";
    АлфавитГУИД = "0123456789abcdef";
    
    СтрГУИД = Строка(Новый УникальныйИдентификатор()); //36 символов
    
    Число = ПереводИзСистемыСчисленияВЧисло(СтрГУИД, СтрДлина(АлфавитГУИД), АлфавитГУИД);
    Результат = ПереводЧислаВСистемуСчисления(Число, СтрДлина(АлфавитUUID), АлфавитUUID);
    
    //Выравниваем до 22
    Пока СтрДлина(Результат) < 22 Цикл
        Результат =  Результат + "0";
    КонецЦикла;
    
    Возврат Результат;
    
КонецФункции


Функция ПереводЧислаВСистемуСчисления(Знач Значение=0, Нотация=36, СтрокаСистемы="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") Экспорт
    //Назначение: Переводит число Значение в строку в заданной системе счисления (Нотация) используя строку знаков этой системы  СтрокаСистемы
    //ДатаСоздания: 20071127
    //Автор: AVB
    //Редактор: Fixin
    //Тестирована: Да
    //Описание:
    //    За основу взят алгоритм avb
    Если Нотация<=0 Тогда Возврат "" КонецЕсли;
    Если Значение<=0 Тогда Возврат "0" КонецЕсли;
    Значение=Цел(Значение);
    Результат="";
    Пока Значение>0 Цикл
        Результат=Сред(СтрокаСистемы,Значение%Нотация+1,1)+Результат;
        Значение=Цел(Значение/Нотация) ;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Функция ПереводИзСистемыСчисленияВЧисло(Знач Значение="",Нотация=36, СтрокаСистемы="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") Экспорт
    //Назначение: Переводит строку Значение в заданной системе счисления (Нотация) в число  используя строку знаков этой системы СтрокаСистемы
    //ДатаСоздания: 20071127
    //Автор: AVB
    //Редактор: Fixin
    //Тестирована: Да
    //Описание:
    //    За основу взят алгоритм avb
    Перем База, Р;
    База=1;
    Р=0;
    Всего=СтрДлина(Значение);
    Для Инд=1 ПО Всего Цикл
        Симв=Сред(Значение, Всего-инд+1, 1);
        Поз=Найти(СтрокаСистемы, ВРЕГ(Симв));
        Если Поз>0 Тогда
            Р=Р+(Поз-1)*База;
            База=База*Нотация;
        КонецЕсли;
    КонецЦикла;
    Возврат Р;
КонецФункции
17 Гений 1С
 
гуру
28.09.20
13:39
ГУИД: 44e06570-e340-4195-bbf1-38c1db51b67f
Число: 82 236 895 033 685 703 638 733 159
Результат: 00000006D7NBOkGRmA5EYD
18 Ненавижу 1С
 
гуру
28.09.20
13:55
ПереводИзСистемыСчисленияВЧисло

Зачем Нотация, если по длине строки ее можно определить?
19 Ненавижу 1С
 
гуру
28.09.20
13:55
и не "нотация", а основание
20 mistеr
 
28.09.20
14:01
(0) Вряд ли это UUID. Скорее всего, какой-то хэш от обычного внутреннего Номера.

>YsEgMwVEh4mwuHax
>Hax

Как бы намекает, что простому 1С-нику с ним не справиться.
21 МихаилМ
 
28.09.20
14:11
зачем же так сложно:
в 1с8 есть встроенная ф-ции работы с BASE64.
22 МихаилМ
 
28.09.20
15:03
я бы сделал красивее
тк 16- ричная и 64- ричная система сопоставимы

без преобразования в число сделал сопоставление. думаю раз в 100 работало бы быстрее.
23 Гений 1С
 
гуру
29.09.20
08:12
(22) а с чего вы решили, что там важна скорость? Или вы хотите раздуть бюджет клиенту ради мнимой "скорости"?
24 Гений 1С
 
гуру
29.09.20
08:13
(18) буквоедство детектед.
25 Гений 1С
 
гуру
29.09.20
08:13
(20) он используется как идентификатор, всё норм. это именно ID
26 NorthWind
 
29.09.20
08:19
(21) если закодить GUID как текст, результирующая строка в Base64 выйдет длиннее чем ему требуется. А если ее тупо обрезать, может уникальность пострадать.
27 sTOd
 
29.09.20
08:35
Ну воот, я что такое Megagroup то не знаю, а его сейчас какой-то 1Сник ещё и убъёт. Распоясались, панимаишь!
28 Кирпич
 
29.09.20
10:08
16 байт в 16 читабельных символов не запихнешь. Где написано, что ID должен быть длиной 16? Может просто GUID вставлять и не париться?
29 mistеr
 
29.09.20
11:54
(25) Я не спорю, что используется. Просто поясняю, что на сайтах обычно делают именно так. ИД-шники из базы наружу просто так не отдают, чтобы не подбирали. Делается некое обратимое преобразование, назовем его хэш. Когда в запросе сайт получает этот хэш, делается обратное преобразование, получается ИД-шник, по нему из базы вытаскивается объект.

Если ты туда пихнешь что-то рандомное, то обратное преобразование от него даст несуществующий ID или ошибку.
30 Гений 1С
 
гуру
30.09.20
08:01
(29) "обычно"? в моем случае они отдают и голый ID. Но вот обмен по Commerce ML с этим сайтом по ID не работает, надо UUID юзать.
31 Кирпич
 
30.09.20
08:35
(30) ну так ты спросил бы у тех, кому этот UUID нужен, как его делать
32 Гений 1С
 
гуру
30.09.20
10:37
(31) у кого это? У клиента? Они не в зуб ногой. ;-)
33 Гений 1С
 
гуру
30.09.20
10:38
(31) но тащем-та я протестировал на самостоятельно сгенерированных UUID, обмен по ним идет. Т.е. они не кэшируют какой-либо ИД, а являются собственно идентификаторами. Теперь я понял, что ты имеешь ввиду.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.