Имя: Пароль:
IT
 
Хеширование строк в числовые последовательности
0 bas28000
 
26.10.12
10:11
Есть некие строки в таблице (ссылки), их необходимо неким образом преобразовывать в уникальную последовательность цифр, при том что эта последовательность должна быть не очень длинная. Никто не сталкивался с такой задачей? Если нужна конкретика, то нужно генерировать промо-коды для участников соц. сетей, используя ссылки на их профили.
1 mikecool
 
26.10.12
10:13
(0) обычный инкремент при регистрации не проканает?
2 bas28000
 
26.10.12
10:14
(1) Можно конечно, но изначально хочется иметь привязку именно к ссылке. А так да, но это последний вариант.
3 mikecool
 
26.10.12
10:15
(2) так при генерации кода сохраняй и ссылку в соответствии
вариант, что код совпадет для двух ссылок тоже есть
4 Asmody
 
26.10.12
10:16
md5 не канает уже?
5 bas28000
 
26.10.12
10:16
Бог ты мой, сейчас задумался а не парсить ли страницы профилей в соц сетях, на предмет нахождения там id пользователей (он цифровой и можно было бы его брать прямо из ссылки, если бы не возможность у пользователей назначать свои короткие ссылки), зашел на Одноклассники и посмотрел их код - ахтунг, товарищи.
6 bas28000
 
26.10.12
10:17
(4) так не числовая же.
7 dk
 
26.10.12
10:22
vk вроде в фотках и видео искользует id юзера, наверняка еще где-нить id есть
8 bas28000
 
26.10.12
10:22
(7) Я выше писал про ОДК - шок и трепет от их кода. Но надо таки посмотреть, да. А в ВК ID действительно есть в коде страницы профиля.
9 bas28000
 
26.10.12
10:24
Кстати в ОДК тоже id нашел, сейчас еще в FB проверю.
10 bas28000
 
26.10.12
10:29
И в FB тоже есть.
11 BigHarry
 
26.10.12
10:31
(10) Ну все, ты раскрыл мировой заговор!
12 bas28000
 
26.10.12
10:33
(11) - ну, я бы все-таки лучше нашел нативную хеш-функцию числовую, наверняка же кто-то сталкивался в мире с таким ограничением.
13 Asmody
 
26.10.12
10:33
(6) а какая же?!
14 Asmody
 
26.10.12
10:34
(13)+ [Хеш содержит 128 бит (16 байт) и обычно представляется как последовательность из 32 шестнадцатеричных цифр.] wiki:md5
15 BigHarry
 
26.10.12
10:36
Ну если эти строки-ссылки не очень велики - то может какой-нить CRC попробовать?
16 bas28000
 
26.10.12
10:39
(13) ну там же есть символы в результате?
17 ptiz
 
26.10.12
10:39
(0) Короткие числа - только инкрементом.
Хэш будет намного длиннее (тот же MD5).
18 bas28000
 
26.10.12
10:40
(14) да-да, только промо-код нужен именно состоящий из цифр, из десятичной системы.
(17) да вот тоже уже понимаю это
19 Asmody
 
26.10.12
10:41
(18) а перевести hex в dec непосильная задача?
20 bas28000
 
26.10.12
10:43
(19) да я могу в целом и сам свою хеш функцию написать, но хочется нативное что-то. А так да, вполне себе способ.
21 BigHarry
 
26.10.12
10:48
(20) Что вкладывается в понятие "нативный"?
22 bas28000
 
26.10.12
10:55
(21) без самодеятельности.
23 HeroShima
 
26.10.12
10:57
(0) зазипуй
24 HeroShima
 
26.10.12
10:58
(22) своеобразное толкование, что сказать
25 bas28000
 
26.10.12
11:21
(24) ну в общем какими-то штатными средствами системы или какого-то языка.
26 BigHarry
 
26.10.12
11:23
(25) Смотрите штатные средства выбранного вами языка или СУБД, что тут еще посоветовать-то?
27 ptiz
 
26.10.12
11:32
(25) В последней БСП в МД5 хэшируется очень даже стандартными методами :)
Функция ВычислитьХешСтрокиПоАлгоритмуMD5(Знач Строка)
   
   a = ЧислоВБинарныйМассив(1732584193); // 01 23 45 67; (шестнадцатеричное представление, сначала младший байт)
   b = ЧислоВБинарныйМассив(4023233417); // 89 AB CD EF;
   c = ЧислоВБинарныйМассив(2562383102); // FE DC BA 98;
   d = ЧислоВБинарныйМассив(271733878);  // 76 54 32 10;
   
   X = Новый Массив(16); // X - блок данных размером 512 бит, массив из 32-битных слов
   
   // разбиваем строку на блоки по 512 бит
   МассивБлоковИзСтроки = ПолучитьМассивБлоковБайтовИзСтроки(Строка);
   
   // для каждого блока производим расчет
   Для НомерБлока = 0 По МассивБлоковИзСтроки.Количество() - 1 Цикл
       Блок = МассивБлоковИзСтроки[НомерБлока];
       Для НомерСлова = 0 по 15 Цикл
           Слово = 0;
           Для НомерБайта = 1 По 4 Цикл
               Слово = Слово + Блок[НомерСлова * 4 + НомерБайта - 1] * Pow(256, НомерБайта - 1);
           КонецЦикла;
           X[НомерСлова] = Слово;
       КонецЦикла;
       
       // в последний блок дописываем длину строки в битах
       Если НомерБлока = МассивБлоковИзСтроки.Количество() - 1 Тогда
           РазмерСтрокиВБитах = СтрДлина(Строка) * 8;
           X[14] = РазмерСтрокиВБитах % Pow(2,32); // сначала младшие 4 байта
           X[15] = Цел(РазмерСтрокиВБитах / Pow(2,32)) % Pow(2,64); // если длина превосходит (2^64 ? 1) бит, то старшие биты откидываем
       КонецЕсли;
       РассчитатьБлок(a, b, c, d, X);
   КонецЦикла;
   
   Результат = ЧислоВШестнадцатеричномПредставлении(БинарныйМассивВЧисло(a))
             + ЧислоВШестнадцатеричномПредставлении(БинарныйМассивВЧисло(b))
             + ЧислоВШестнадцатеричномПредставлении(БинарныйМассивВЧисло(c))
             + ЧислоВШестнадцатеричномПредставлении(БинарныйМассивВЧисло(d));
   
   Возврат Результат;
   
КонецФункции
28 HeroShima
 
26.10.12
11:33
С каких пор всякие MD5 гарантируют уникальность?
29 orakool
 
26.10.12
12:04
(28) С каких пор от хеширования требуют уникальности, как это делает автор топика с заголовке и внутри самого поста ?
30 HeroShima
 
26.10.12
12:06
(29) С этим как раз всё ясно - ТС нативный.
31 Гинзбург
 
26.10.12
12:13
где это все ?