Имя: Пароль:
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
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан