powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TDictionary или TList<>.BinarySearch с позиции поиска
25 сообщений из 479, страница 3 из 20
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369122
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А на длинных строках разница может быть и вдвое
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369123
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Строки по 255 символов:

2109 vs 1282
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369124
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Случайно на x64 тестил.

Release x86 (Small Strings) 1078 vs 875
Release x86 (256 Strings) 1125 vs 562
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369125
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatСлучайно на x64 тестил.

Release x86 (Small Strings) 1078 vs 875
Release x86 (256 Strings) 1125 vs 562

Ну в общем получается что на типичных данных разница менее 30%. Строки в 255 редко засовывают в словарь.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369126
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkov,

15-30% - это мало?

Кода меньше, и работает он лучше.
А CRC32 еще и преинициализации массива требует.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369127
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatasviridenkov,

15-30% - это мало?

Кода меньше, и работает он лучше.
А CRC32 еще и преинициализации массива требует.

Это не много и не мало. Тут больше вопроса к количестве коллизий. Странно, что обычно используют CRC если есть такой простой и хороший вариант.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369128
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вообще-то это довольно старый и известный алгоритм от Роберта Седжвика .

http://snipplr.com/view/55639/hashing-function-for-c/
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369130
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и в отличие от CRC32 он заточен под WideChar.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369183
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, послушайте старого специалиста в оптимизациях
Обычно люди запарены на коллизиях. Например, в теории размер хеш-массива должна быть простым числом. Чтобы минимизировать коллизии
Однако на самом деле соотношение коллизий к прямому доступа - низкое. При том, что коллизия - это всего лишь несколько дополнительных сравнений.
Поэтому ключевой приоритет по производительности - доступ к элементу массива. Если размер хеш-массива является простым числом - то доступ к элементу осуществляется через операцию вычисления остатка от деления. То самое деление, которое выполняет ориентировочно 30 тактов. Именно поэтому ребята-хешеры, достаточно быстро перешли от простого числа к степени двойки - чтобы заменить деление обычным and.

Второй вопрос - хеш функция. В большинстве случаев подойдёт длинна и сумма байт/символов. CRC32 хорош, но он лезет в таблицу и делает много промежуточных операций. rgreat тоже классную функцию привёл, но там два умножения.
В большинстве случаев хватит этого:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function StringHash(const Value: string): Integer;
var
  i: NativeInt;
  S: PChar;
begin
  S := Pointer(Value);
  Result := 0;
  if (S <> nil) then
  begin
    Result := PInteger(NativeInt(Value) - 4)^;

    for i := 0 to NativeInt(Result) - 1 do
    begin
      Result := Result + Ord(S[i]);
    end;
  end;
end;



Лично у меня такая функция давала отличные результаты. Но для всяких классификаторов (ИНН, КПП, автомобильные номера, номера договоров, ...) коллизий было действительно много. Длинна строк одинаковая, набор символов похожий, и в сумме хеш совпадал. И не то, чтобы производительность не устраивала, стало сложно отлаживать. Ситуация спасла привязка к индексу символа. Вот такая функция будет быстра и удобна вообще для всего )
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function StringHash(const Value: string): Integer;
var
  i: NativeInt;
  S: PChar;
begin
  S := Pointer(Value);
  Result := 0;
  if (S <> nil) then
  begin
    Result := PInteger(NativeInt(Value) - 4)^;

    for i := 0 to NativeInt(Result) - 1 do
    begin
      Result := Result xor (Result shr (i and 7)) + Ord(S[i]);
    end;
  end;
end;
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369192
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

коллизии сильно зависят от данных, автор же вместо того, что бы рассказать больше о задаче, выгоняет всех из топика.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369199
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Не сильно
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369204
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
rgreatБыстрый хэшик для строки.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
{$OverFlowChecks OFF}
function GetHash(const Key: String): integer;
var
  a : Integer;
  i : Integer;
begin
  Result:=0;
  a:=63689;
  for i:=1 To Length(Key)-1 do begin
    Result:=Result*a+PWordArray(Key)[i];
    a:=a*378551;
  end;
end;


отличная функция ! утащил к себе в копилку
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369213
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovSOFT FOR YOUпропущено...


А ты сравни с CachedSerializer

Я же тест выложил, запусти и сравни.

Вот тест:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
program Test;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Winapi.Windows,
  System.Generics.Collections,
  System.SysUtils,
  System.Classes;

const
  ITERATIONS_COUNT = 1000000 div 10;

var
  i, k: NativeInt;
  VALUES: TArray<string>;
  Time: Cardinal;
  StringList: TStringList;
  Dictionary: TDictionary<string, Integer>;

type
  THtmlTag = (tagUnknown, tagAddress, tagBlockquote, tagBody, tagButton, tagDel, tagDiv,
    tagFieldset, tagFrame, tagFrameset, tagH1, tagH2, tagH3, tagH4, tagH5, tagHtml,
    tagImg, tagLegend, tagLi, tagMenu, tagMeta, tagOl, tagPre, tagScript, tagSmall,
    tagSpan, tagStrike, tagStyle, tagSub, tagSup, tagTable, tagTbody, tagTd, tagTextarea,
    tagTh, tagThead, tagTr, tagUl);

function StrToHtmlTag(const S: UnicodeString): THtmlTag;
type
  HugeByteArray = array[0..High(Integer) div SizeOf(Byte) - 1] of Byte;
  HugeWordArray = array[0..High(Integer) div SizeOf(Word) - 1] of Word;
  HugeCardinalArray = array[0..High(Integer) div SizeOf(Cardinal) - 1] of Cardinal;
  HugeNativeUIntArray = array[0..High(Integer) div SizeOf(NativeUInt) - 1] of NativeUInt;

  PMemoryItems = ^TMemoryItems;
  TMemoryItems = packed record
  case Integer of
    0: (Bytes: HugeByteArray);
    1: (Words: HugeWordArray);
    2: (Cardinals: HugeCardinalArray);
    3: (NativeUInts: HugeNativeUIntArray);
    4: (A1: array[1..1] of Byte;
        case Integer of
          0: (Words1: HugeWordArray);
          1: (Cardinals1: HugeCardinalArray);
          2: (NativeUInts1: HugeNativeUIntArray);
        );
    5: (A2: array[1..2] of Byte;
        case Integer of
          0: (Cardinals2: HugeCardinalArray);
          1: (NativeUInts2: HugeNativeUIntArray);
        );
    6: (A3: array[1..3] of Byte;
        case Integer of
          0: (Cardinals3: HugeCardinalArray);
          1: (NativeUInts3: HugeNativeUIntArray);
        );
  end;
var
  Len: Integer;
begin
  // default value
  Result := tagUnknown;
  if (Pointer(S) = nil) then Exit;
  Len := PInteger(NativeInt(S) - 4)^;

  // utf16 ascii
  with PMemoryItems(S)^ do
  if (Len >= 2) then
  case (Words[0]) of // "address", "blockquote", "body", "button", "del", "div", ...
    $0061: if (Len = 7) and (Cardinals2[0] = $00640064) and (Cardinals2[1] = $00650072) and
           (Cardinals2[2] = $00730073) then Result := tagAddress; // "address"
    $0062: case Len of // "body", "button", "blockquote"
             4: if (Cardinals2[0] = $0064006F) and (Words[3] = $0079) then
                Result := tagBody; // "body"
             6: if (Cardinals2[0] = $00740075) and (Cardinals2[1] = $006F0074) and
                (Words[5] = $006E) then Result := tagButton; // "button"
             10: if (Cardinals2[0] = $006F006C) and (Cardinals2[1] = $006B0063) and
                 (Cardinals2[2] = $00750071) and (Cardinals2[3] = $0074006F) and
                 (Words[9] = $0065) then Result := tagBlockquote; // "blockquote"
           end;
    $0064: if (Len = 3) then
           case (Cardinals2[0]) of // "del", "div"
             $006C0065: Result := tagDel; // "del"
             $00760069: Result := tagDiv; // "div"
           end;
    $0066: case Len of // "frame", "fieldset", "frameset"
             5: if (Cardinals2[0] = $00610072) and (Cardinals2[1] = $0065006D) then
                Result := tagFrame; // "frame"
             8: case (Cardinals2[0]) of // "fieldset", "frameset"
                  $00650069: if (Cardinals2[1] = $0064006C) and (Cardinals2[2] = $00650073) and
                             (Words[7] = $0074) then Result := tagFieldset; // "fieldset"
                  $00610072: if (Cardinals2[1] = $0065006D) and (Cardinals2[2] = $00650073) and
                             (Words[7] = $0074) then Result := tagFrameset; // "frameset"
                end;
           end;
    $0068: case Len of // "h1", "h2", "h3", "h4", "h5", "html"
             2: case (Words[1]) of // "h1", "h2", "h3", "h4", "h5"
                  $0031: Result := tagH1; // "h1"
                  $0032: Result := tagH2; // "h2"
                  $0033: Result := tagH3; // "h3"
                  $0034: Result := tagH4; // "h4"
                  $0035: Result := tagH5; // "h5"
                end;
             4: if (Cardinals2[0] = $006D0074) and (Words[3] = $006C) then
                Result := tagHtml; // "html"
           end;
    $0069: if (Len = 3) and (Cardinals2[0] = $0067006D) then Result := tagImg; // "img"
    $006C: case Len of // "li", "legend"
             2: if (Words[1] = $0069) then Result := tagLi; // "li"
             6: if (Cardinals2[0] = $00670065) and (Cardinals2[1] = $006E0065) and
                (Words[5] = $0064) then Result := tagLegend; // "legend"
           end;
    $006D: if (Len = 4) then
           if (Words[1] = $0065) then
           case (Cardinals[1]) of // "menu", "meta"
             $0075006E: Result := tagMenu; // "menu"
             $00610074: Result := tagMeta; // "meta"
           end;
    $006F: if (Len = 2) and (Words[1] = $006C) then Result := tagOl; // "ol"
    $0070: if (Len = 3) and (Cardinals2[0] = $00650072) then Result := tagPre; // "pre"
    $0073: case Len of // "sub", "sup", "span", "small", "style", "script", "strike"
             3: if (Words[1] = $0075) then
                case (Words[2]) of // "sub", "sup"
                  $0062: Result := tagSub; // "sub"
                  $0070: Result := tagSup; // "sup"
                end;
             4: if (Cardinals2[0] = $00610070) and (Words[3] = $006E) then
                Result := tagSpan; // "span"
             5: case (Cardinals2[0]) of // "small", "style"
                  $0061006D: if (Cardinals2[1] = $006C006C) then Result := tagSmall; // "small"
                  $00790074: if (Cardinals2[1] = $0065006C) then Result := tagStyle; // "style"
                end;
             6: case (Cardinals2[0]) of // "script", "strike"
                  $00720063: if (Cardinals2[1] = $00700069) and (Words[5] = $0074) then
                             Result := tagScript; // "script"
                  $00720074: if (Cardinals2[1] = $006B0069) and (Words[5] = $0065) then
                             Result := tagStrike; // "strike"
                end;
           end;
    $0074: case Len of // "td", "th", "tr", "table", "tbody", "thead", "textarea"
             2: case (Words[1]) of // "td", "th", "tr"
                  $0064: Result := tagTd; // "td"
                  $0068: Result := tagTh; // "th"
                  $0072: Result := tagTr; // "tr"
                end;
             5: case (Cardinals2[0]) of // "table", "tbody", "thead"
                  $00620061: if (Cardinals2[1] = $0065006C) then Result := tagTable; // "table"
                  $006F0062: if (Cardinals2[1] = $00790064) then Result := tagTbody; // "tbody"
                  $00650068: if (Cardinals2[1] = $00640061) then Result := tagThead; // "thead"
                end;
             8: if (Cardinals2[0] = $00780065) and (Cardinals2[1] = $00610074) and
                (Cardinals2[2] = $00650072) and (Words[7] = $0061) then
                Result := tagTextarea; // "textarea"
           end;
    $0075: if (Len = 2) and (Words[1] = $006C) then Result := tagUl; // "ul"
  end;
end;

begin
  VALUES := [
    'div',
    'span',
    'table',
    'td',
    'tr',
    'th',
    'li',
    'meta',
    'script',
    'style',
    'ol',
    'ul',
    'h1',
    'h2',
    'h3',
    'h4',
    'h5',
    'thead',
    'tbody',
    'html',
    'body',
    'blockquote',
    'address',
    'frame',
    'frameset',
    'pre',
    'button',
    'textarea',
    'strike',
    'del',
    'menu',
    'small',
    'sub',
    'sup',
    'img',
    'fieldset',
    'legend'
  ];

  try
    // бинарный поиск
    begin
      Write('Бинарный поиск(TStringList)...');
      StringList := TStringList.Create;
      try
        for k := Low(VALUES) to High(VALUES) do StringList.Add(VALUES[k]);
        StringList.Sorted := True;

        Time := GetTickCount;
        for i := 1 to ITERATIONS_COUNT do
        for k := Low(VALUES) to High(VALUES) do
        begin
          StringList.IndexOf(VALUES[k]);
        end;
        Time := GetTickCount - Time;
        Writeln(' ', Time, 'мс');
      finally
        StringList.Free;
      end;
    end;

    // хеш
    begin
      Write('Хеш поиск(Dictionary)...');
      Dictionary := TDictionary<string, Integer>.Create;
      try
        for k := Low(VALUES) to High(VALUES) do
          Dictionary.Add(VALUES[k], 0);

        Time := GetTickCount;
        for i := 1 to ITERATIONS_COUNT do
        for k := Low(VALUES) to High(VALUES) do
        begin
          Dictionary.Items[VALUES[k]];
        end;
        Time := GetTickCount - Time;
        Writeln(' ', Time, 'мс');
      finally
        Dictionary.Free;
      end;
    end;

    // кодогенерация
    begin
      Write('Кодогенерация(CachedSerializer)...');

      Time := GetTickCount;
      for i := 1 to ITERATIONS_COUNT do
      for k := Low(VALUES) to High(VALUES) do
      begin
        StrToHtmlTag(VALUES[k]);
      end;
      Time := GetTickCount - Time;
      Writeln(' ', Time, 'мс');
    end;

    // нажать Enter
    Writeln;
    Write('Press Enter');
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.



Вот результаты:
Код: plaintext
1.
2.
3.
4.
Бинарный поиск(TStringList)... 2044мс
Хеш поиск(Dictionary)... 172мс
Кодогенерация(CachedSerializer)... 15мс

Press Enter
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369229
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUВот такая функция будет быстра и удобна вообще для всего
SOFT FOR YOUНе сильно
Ты хоть проверял, то о чём говоришь? Твоя функция на наборе последовательно изменяющихся ключей с общей частью просто сосёт. На наборе размером в 1млн. ключей (Index1 .. Index1000000) она даёт только 145 уникальных хешей, тогда как Седжвик даёт 999994. То есть, у твоей функции на этом наборе будет 999855 коллизий, а у Седжвика всего 6. На рандомных ключах (GUID) и с тем же размером набора в 1 млн., твоя функция даёт всего 244 уникальных хеша (999756 коллизий), Седжвик даёт 999871 (129 коллизий).
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369236
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для прикола ещё и на английском словаре проверил. Размер словаря 30322 слова. У твоей функции всего 661 уникальный хеш (29661 коллизий), у Седжвика 30322 (коллизий нет).
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369239
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Код/данные в студию
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369240
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Понял
Попробуй вот так :)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function StringHash(const Value: string): Integer;
var
  i: NativeInt;
  S: PChar;
begin
  S := Pointer(Value);
  Result := 0;
  if (S <> nil) then
  begin
    Result := PInteger(NativeInt(Value) - 4)^;

    for i := 0 to NativeInt(Result) - 1 do
    begin
      Result := Result xor (Result shr (i and 7 + 1)) + Ord(S[i]);
    end;
  end;
end;
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369242
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUKazantsev Alexey,

Понял
Попробуй вот так

что там с твоим титаником ? можно забить или есть шанс ?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369243
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUКод/данные в студию
Какие данные тебе нужны?
Код: pascal
1.
SetLength(keys, 1000000);


Миллион GUID'ов:
Код: pascal
1.
2.
for i := low(keys) to high(keys) do
 keys[i] := TGuid.NewGuid.ToString;


Последовательные ключи:
Код: pascal
1.
2.
for i := low(keys) to high(keys) do
 keys[i] := 'Index' + IntToStr(i);



Хеши сам посчитай.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369245
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorSOFT FOR YOUKazantsev Alexey,

Понял
Попробуй вот так

что там с твоим титаником ? можно забить или есть шанс ?

Скинь свой проект, я буду его трейсить
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369246
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeySOFT FOR YOUКод/данные в студию
Какие данные тебе нужны?
Код: pascal
1.
SetLength(keys, 1000000);


Миллион GUID'ов:
Код: pascal
1.
2.
for i := low(keys) to high(keys) do
 keys[i] := TGuid.NewGuid.ToString;


Последовательные ключи:
Код: pascal
1.
2.
for i := low(keys) to high(keys) do
 keys[i] := 'Index' + IntToStr(i);



Хеши сам посчитай.

Харе лениться. Заколебали
Выложи dpr. Ещё я коллизии не считал
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369247
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecatorпропущено...


что там с твоим титаником ? можно забить или есть шанс ?

Скинь свой проект, я буду его трейсить
хм....может быть, ещё и ключи от квартиры, где деньги лежат ? (с)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369248
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorSOFT FOR YOUпропущено...


Скинь свой проект, я буду его трейсить
хм....может быть, ещё и ключи от квартиры, где деньги лежат ? (с)

Почему нет?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369249
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUПопробуй вот так :)
Стало чуть лучше, но всё равно отстой:
рандомные ключи 1млн: 7091 уникальный хеш
последовательные 1млн: 348 уникальных хешей
английский словарь 30322: 1580 уникальных хешей
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369250
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecatorпропущено...

хм....может быть, ещё и ключи от квартиры, где деньги лежат ? (с)

Почему нет?
потому что - нет
...
Рейтинг: 0 / 0
25 сообщений из 479, страница 3 из 20
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TDictionary или TList<>.BinarySearch с позиции поиска
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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