Имя: Пароль:
1C
1С v8
хеш в 16 символов
,
0 Zixxx
 
06.05.14
21:14
Как правильнее получить уникальный хеш длиной в 16 символов из уникального идентификатора 1с? Необходимо для интеграции. Есть скрипты для кодирования по алгоритму они возвращают хеш в 32 символа, есть что-нибудь похожее для хеша в 16 символов. И на сколько правильно будет брать первые 16 символов от 1с-ного идентификатора?
1 МихаилМ
 
07.05.14
00:04
берите не первые, а случайные 16
2 Armando
 
07.05.14
00:39
Я для штрихкода CODE128 до 20 ужимал. Про 16 не слышал.
3 DirecTwiX
 
07.05.14
02:25
(0) Бери первые 16 из хеша для "кодирования по алгоритму". Либо сложи посимвольно две половины.
Первые 16 символов от УИД тоже как хэш должны пойти. Посчитать хэш для журнала документов, сгруппировать и посмотреть разброс совпадений.
4 DirecTwiX
 
07.05.14
02:29
И да, из УИДа логично брать только символы - без скобок и дефисов.
5 Serginio1
 
07.05.14
11:58
Неправильно. Вообще Хэш это либо байтовый масив либо uint или UInt64
Можно проиксорить 2 части либо например взять пример вычисления хэша для строки

public override unsafe int GetHashCode()
{
    if (HashHelpers.s_UseRandomizedStringHashing)
    {
        return InternalMarvin32HashString(this, this.Length, 0L);
    }
    fixed (char* str = ((char*) this))
    {
        char* chPtr = str;
        int num = 0x15051505;
        int num2 = num;
        int* numPtr = (int*) chPtr;
        int length = this.Length;
        while (length > 2)
        {
            num = (((num << 5) + num) + (num >> 0x1b)) ^ numPtr[0];
            num2 = (((num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr[1];
            numPtr += 2;
            length -= 4;
        }
        if (length > 0)
        {
            num = (((num << 5) + num) + (num >> 0x1b)) ^ numPtr[0];
        }
        return (num + (num2 * 0x5d588b65));
    }
}
6 ptiz
 
07.05.14
12:08
(0) "они возвращают хеш в 32 символа" - может я чего-то не понял, но изначально УИД в 1С как раз - 32 символа.
7 DirecTwiX
 
07.05.14
13:36
(5) Ммм.. Что неправильного увидел?)
Хешем может быть почти всё, что на ум придёт. Один символ, одна цифра и т.д.

(6) УИД - не очень под хеш подходит, т.к. он уникальный)
Но тут уже лучше автора спросить, зачем ему понадобился хеш как таковой)
8 Serginio1
 
07.05.14
15:36
(7) Хэш это набор бит. Смысл его в том, что бы перемешать биты и уменьшить емкость значения при этом получить минимальную вероятность появления коллизий разных значений с одинаковым хэшем.

Или wiki:Hash?previous=yes
Хеширование (иногда «хэширование», англ. hashing) — преобразование по детерминированному алгоритму входного массива данных произвольной длины в выходную битовую строку фиксированной длины. Такие преобразования также называются хеш-функциями или функциями свёртки, а их результаты называют хешем, хеш-кодом или сводкой сообщения (англ. message digest).


Хорошая хеш-функция должна удовлетворять двум свойствам:
быстро вычисляться;
минимизировать количество коллизий


УИД неуникален. Есть вероятность коллизий.
А так ему видно хочется уменьшить разрядность хэша
9 Torquader
 
07.05.14
15:37
Что-то мне кажется, что если символ - это байт, то 16 байт - это и есть GUID.
10 Zixxx
 
07.05.14
17:25
(7) Для интеграции доков, у получающей стороны ID = 16 символов
11 ptiz
 
07.05.14
17:30
Заведи справочник УИДов.
Код справочника будет хешем.
12 Lama12
 
07.05.14
17:40
(0)Прислушайся к (11) это самый лучший вариант.
13 Zixxx
 
07.05.14
17:58
(11), (12) Ну так-то да, решение вроде хорошее
14 spock
 
07.05.14
18:44
В какие-то крайности вас понесло! Все давно придумано:http://www.sql.ru/forum/349486-2/podskazhite-algoritm-szhatiya-stroki-teksta
15 DirecTwiX
 
08.05.14
00:15
(8) УИД неуникален? Как так получилось? Разве он не на то и УИД, что уникальный?)
16 DirecTwiX
 
08.05.14
01:09
(8) И ты так и не ответил на вопрос, что неправильного в (5) увидел. Либо я не заметил ответа)

>минимизировать количество коллизий
Нет же)
17 Serginio1
 
08.05.14
09:13
wiki:GUID
Хотя уникальность каждого отдельного GUID не гарантируется, общее количество уникальных ключей настолько велико (2128 или 3,4028?1038), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, крайне мала.

В 1С с их генерацией УИД вероятность больше
18 Serginio1
 
08.05.14
10:24
(16) Неправильно брать первые 16 символов. Нужно брать все 32 хэшировать их в 12 байт и переводить в Base64. Вот так будет правильно. Тогда вероятность коллизий резко уменьшится.
Но для его задачи лучше всего 11
Независимо от того, куда вы едете — это в гору и против ветра!