powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Нужно маскимально быстро сформировать ключ по двум целым числам.
13 сообщений из 13, страница 1 из 1
Нужно маскимально быстро сформировать ключ по двум целым числам.
    #38271383
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно сделать уникальный ключ из двух целых неотрицательных чисел i и j (индексы двумерного массива).
Приходит в голову что-то типа:

string key = i + "," + j;

Может у кого-то есть еще идеи?
Преобразование в string с последующей конкатенацией - не очень быстрый способ.
Другой пока на ум не идет.
...
Рейтинг: 0 / 0
Нужно маскимально быстро сформировать ключ по двум целым числам.
    #38271493
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlsafНужно сделать уникальный ключ из двух целых неотрицательных чисел i и j (индексы двумерного массива).
Приходит в голову что-то типа:

string key = i + "," + j;

Может у кого-то есть еще идеи?
Преобразование в string с последующей конкатенацией - не очень быстрый способ.
Другой пока на ум не идет.Для двух неотрицательных int, например, как-то так:
Код: c#
1.
  long k = i * 0x100000000 + j;

или так:
Код: c#
1.
  long k = i << 32 + j;
...
Рейтинг: 0 / 0
Нужно маскимально быстро сформировать ключ по двум целым числам.
    #38271900
vlsaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mv, спасибо огромное!
...
Рейтинг: 0 / 0
Нужно маскимально быстро сформировать ключ по двум целым числам.
    #38272180
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vlsaf,
А чем не подходит банальное сложение?
...
Рейтинг: 0 / 0
Нужно маскимально быстро сформировать ключ по двум целым числам.
    #38272251
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВvlsaf,
А чем не подходит банальное сложение?
сумма может наложиться на другое число.
...
Рейтинг: 0 / 0
Нужно маскимально быстро сформировать ключ по двум целым числам.
    #38272907
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-erЕвгенийВvlsaf,
А чем не подходит банальное сложение?
сумма может наложиться на другое число.
С этого момента можно поподробнее?
Что разве мощность множества
i * 0x100000000 + j
больше
i+j?
...
Рейтинг: 0 / 0
Нужно маскимально быстро сформировать ключ по двум целым числам.
    #38272955
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВЧто разве мощность множества
i * 0x100000000 + j
больше
i+j?
Если в обоих случаях мы будет сохранять результат в long, то мощность будет, очевидно, одинаковой. beg-in-er похоже имел в виду что сложение двух чисел можеть дать неуникальные значения (как требуется автору вопроса). Например, пары 1+3, 2+2. Решение sphinx_mv лишено этого недостатка.
...
Рейтинг: 0 / 0
Нужно маскимально быстро сформировать ключ по двум целым числам.
    #38272973
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

именно это и имел ввиду
Код: c#
1.
2.
3.
4.
           string s1="hello";
            string s2="world";
            long L = (((long)s1.GetHashCode()) << 32) + s2.GetHashCode();
            //L= -1406257598958874302


это число однозначно определяет пару "hello world"

хотя яндекс при поиске бинарных пар использует словарь в 15-20 миллионов.
...
Рейтинг: 0 / 0
Нужно маскимально быстро сформировать ключ по двум целым числам.
    #38272982
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все-таки эффективность решения зависит от дальнейшего применения этого значения. У меня встречались подобные ситуации, но часто приходилось выбирать в пользу строки, как это не кощунственно звучит.
...
Рейтинг: 0 / 0
Нужно маскимально быстро сформировать ключ по двум целым числам.
    #38273036
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-erbazile,

именно это и имел ввиду
Код: c#
1.
2.
3.
4.
           string s1="hello";
            string s2="world";
            long L = (((long)s1.GetHashCode()) << 32) + s2.GetHashCode();
            //L= -1406257598958874302


это число однозначно определяет пару "hello world"

хотя яндекс при поиске бинарных пар использует словарь в 15-20 миллионов.
Логику программы никогда не нужно завязывать на string.GetHashCode(). В МС меняют этот алгоритм меняют каждую неделю, дабы выявить возможную зависимость.
-1406257598958874302 - в имеющейся и всех последующих реализациях определяет "hello world" и еще ОГРОМНОЕ количество строк!
...
Рейтинг: 0 / 0
Нужно маскимально быстро сформировать ключ по двум целым числам.
    #38273045
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВВ МС меняют этот алгоритм меняют каждую неделю, дабы выявить возможную зависимость.
Каким боком здесь уязвимость? Контракт GetHashCode вообще не подразумевает уникальности возвращаемого значения, у него задача - балансировка дерева.
...
Рейтинг: 0 / 0
Нужно маскимально быстро сформировать ключ по двум целым числам.
    #38273087
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВGetHashCode(). В МС меняют этот алгоритм меняют каждую неделю
ну есть же реализация. которая не зависит от платформы и прочих нюансов.
в конце концов его можно переопределить для System.Object
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public unsafe static int Get_Hash_Code( string s)
        {
            List<char> cc = new List<char>();
            for (int i = 0; i < s.Length; i++) cc.Add(s[i]);
            fixed (char* str = &(cc.ToArray())[0])
            {
                int num3;
                char* chPtr = str;
                int num = 0x1505;
                int num2 = num;
                for (char* chPtr2 = chPtr; (num3 = chPtr2[0]) != '\0'; chPtr2 += 2)
                {
                    num = ((num << 5) + num) ^ num3;
                    num3 = chPtr2[1];
                    if (num3 == 0) break;
                    num2 = ((num2 << 5) + num2) ^ num3;
                }
                return (num + (num2 * 0x5d588b65));
            }
        }



а если строк много, но не очень, то лучше гонять словарь. яндекс то не парится.
...
Рейтинг: 0 / 0
Нужно маскимально быстро сформировать ключ по двум целым числам.
    #38273126
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по идее, если в структуру запихать будет и однозначное соответствие и очень шустро ключи будут создаваться.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Нужно маскимально быстро сформировать ключ по двум целым числам.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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