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

string key = i + "," + j;

Может у кого-то есть еще идеи?
Преобразование в string с последующей конкатенацией - не очень быстрый способ.
Другой пока на ум не идет.
...
Рейтинг: 0 / 0
24.05.2013, 10:55
    #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
24.05.2013, 13:00
    #38271900
vlsaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно маскимально быстро сформировать ключ по двум целым числам.
sphinx_mv, спасибо огромное!
...
Рейтинг: 0 / 0
24.05.2013, 14:25
    #38272180
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно маскимально быстро сформировать ключ по двум целым числам.
vlsaf,
А чем не подходит банальное сложение?
...
Рейтинг: 0 / 0
24.05.2013, 14:46
    #38272251
beg-in-er
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно маскимально быстро сформировать ключ по двум целым числам.
ЕвгенийВvlsaf,
А чем не подходит банальное сложение?
сумма может наложиться на другое число.
...
Рейтинг: 0 / 0
24.05.2013, 23:07
    #38272907
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно маскимально быстро сформировать ключ по двум целым числам.
beg-in-erЕвгенийВvlsaf,
А чем не подходит банальное сложение?
сумма может наложиться на другое число.
С этого момента можно поподробнее?
Что разве мощность множества
i * 0x100000000 + j
больше
i+j?
...
Рейтинг: 0 / 0
25.05.2013, 01:06
    #38272955
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно маскимально быстро сформировать ключ по двум целым числам.
ЕвгенийВЧто разве мощность множества
i * 0x100000000 + j
больше
i+j?
Если в обоих случаях мы будет сохранять результат в long, то мощность будет, очевидно, одинаковой. beg-in-er похоже имел в виду что сложение двух чисел можеть дать неуникальные значения (как требуется автору вопроса). Например, пары 1+3, 2+2. Решение sphinx_mv лишено этого недостатка.
...
Рейтинг: 0 / 0
25.05.2013, 02:06
    #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
25.05.2013, 03:02
    #38272982
skole
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно маскимально быстро сформировать ключ по двум целым числам.
Все-таки эффективность решения зависит от дальнейшего применения этого значения. У меня встречались подобные ситуации, но часто приходилось выбирать в пользу строки, как это не кощунственно звучит.
...
Рейтинг: 0 / 0
25.05.2013, 11:08
    #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
25.05.2013, 11:35
    #38273045
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно маскимально быстро сформировать ключ по двум целым числам.
ЕвгенийВВ МС меняют этот алгоритм меняют каждую неделю, дабы выявить возможную зависимость.
Каким боком здесь уязвимость? Контракт GetHashCode вообще не подразумевает уникальности возвращаемого значения, у него задача - балансировка дерева.
...
Рейтинг: 0 / 0
25.05.2013, 13:15
    #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
25.05.2013, 14:36
    #38273126
Denis.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужно маскимально быстро сформировать ключ по двум целым числам.
по идее, если в структуру запихать будет и однозначное соответствие и очень шустро ключи будут создаваться.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Нужно маскимально быстро сформировать ключ по двум целым числам. / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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