powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / string.GetHashCode() - нужна альтернатива, гарантирующая результат
81 сообщений из 81, показаны все 4 страниц
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556614
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

В документации метода GetHashCode() написано
docs.microsoft.comIf two string objects are equal, the GetHashCode method returns identical values. However, there is not a unique hash code value for each unique string value. Different strings can return the same hash code.
То есть разработчики не гарантируют одинакового результата на одинаковых строках. В принципе, я уже натолкнулся на это.
Но очень нужен гарантированный результат. Может кто посоветует какую-то альтернативу? Ну и, конечно, подход должен быть достаточно быстрым.

Спасибо
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556619
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то искал в инете хэши для строк, лучшее что нашлось:
Код: plaintext
1.
2.
3.
4.
5.
6.
hash_t hash32(const void* data, size_t len, hash_t prev = 0) {
	const char* str = (const char*) data;
	hash_t h = prev;
	while (len--) h = (h << 5) + h + *str++;
	return h;
}


Это на С, но под C# думаю несложно переписать.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556620
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokТо есть разработчики не гарантируют одинакового результата на одинаковых строках.Это как раз гарантируется.

Не гарантируется, что результат на разных строках будет разный (Т.е. две разные строки могут иметь одинаковый хеш).
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556624
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,

ну как бы ни было, но такой сценарий меня не устраивает
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556644
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichokrefreg,

ну как бы ни было, но такой сценарий меня не устраивает

непонятно, чем?
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556652
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichokну как бы ни было, но такой сценарий меня не устраиваетА как ты собираешься в 2^32 вариантов впихнуть гораздо большее количество вариантов, представляемых строками, и чтобы все уникальные были???
Int32 не резиновый
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556653
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pation,

ну тем, что две разные строки будут иметь одинаковый хеш. Мне как раз нужна уникальность, что одна и та же строка будет иметь свой, уникальный, хеш, который не будет пересекаться с хешами других строк.
Из-за этого поведения string.GetHashCode() у меня программа выдает неправильные результаты
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556657
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokМне как раз нужна уникальность, что одна и та же строка будет иметь свой, уникальный, хеш, который не будет пересекаться с хешами других строк.Тогда это просто НЕ будет хэшем. Твой вариант - это использовать в качестве хэша саму строку.

_NovichokИз-за этого поведения string.GetHashCode() у меня программа выдает неправильные результатыЭто не из-за его поведения, а из-за твоего непонимания, для чего вообще нужен хэш
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556660
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichok,

После проверки равенства хешей проверяются равенства строк.
Равенство хешей - это необходимое, но не достаточное условие.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556664
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Shocker.ProА как ты собираешься в 2^32 вариантов впихнуть гораздо большее количество вариантов, представляемых строками, и чтобы все уникальные были???
Int32 не резиновый
ну я собственно и спрашиваю
_NovichokМожет кто посоветует какую-то альтернативу?
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556668
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЭто не из-за его поведения, а из-за твоего непонимания, для чего вообще нужен хэш
Для чего нужен хеш?

мне он нужен, чтобы каким-либо образом идентифицировать строку, но не хранить в памяти сами строки, поскольку они могут быть очень длинными, при то, что сами строки нигде не используются
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556675
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokShocker.ProЭто не из-за его поведения, а из-за твоего непонимания, для чего вообще нужен хэш
Для чего нужен хеш?

мне он нужен, чтобы каким-либо образом идентифицировать строку, но не хранить в памяти сами строки, поскольку они могут быть очень длинными, при то, что сами строки нигде не используютсяПримерно так выглядит твой ответ:
Код: c#
1.
2.
3.
Зачем нужен топор?

Мне он нужен, чтобы сварить кашу...
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556679
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть только 1 алгоритм гарантирующий на 100% этот способ называется побитовое сравнение. других 100% способов не существует.
В Dictionary для этого для каждого хеша может хранится больше 1го элемента на сколько я помню
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556688
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichokне хранить в памяти сами строки, поскольку они могут быть очень длинными
А вы за машину сильно не переживайте.
Пока нет оснований. Память кончилась? Есть СУБД.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556694
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,

если они ни где не используются нафига они нужны?
Сжимайте строки и сравнивайте их в сжатом виде. Если энтропия строки низкая, а размер большой, уровень сжатия может быть очень большим. Тем более, если они вам больше не нужны. Если высокая, то сжимать особо смысла нет конечно.
Просто нужно хранить "таблицу" хеш сумм которая будет связана со строками и она должна быть один хеш ко многим строкам. Так вы сможете определить, что заданный хеш встречается только 1 раз и проверять побитно нет смысла. Если их более 1, нужно определить какая из строк равна, так же можно хранить несколько хешей, основанных на разных алгоритмах, вероятность того, что оба будут совпадать будет ничтожной или использовать алгоритмы большей битности.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556697
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg_Novichokпропущено...

Для чего нужен хеш?

мне он нужен, чтобы каким-либо образом идентифицировать строку, но не хранить в памяти сами строки, поскольку они могут быть очень длинными, при то, что сами строки нигде не используютсяПримерно так выглядит твой ответ:
Код: c#
1.
2.
3.
Зачем нужен топор?

Мне он нужен, чтобы сварить кашу...


за что я люблю отечественные форумы, что на них вместо ответа начинают рассказывать какие мы умные, и насколько тупой автор. на том же stackoverflow держатся как-то корректнее. Грустно из-за этого...

Ну вот вы объясните, заем нужен хеш, а не топорами бросайтесь в ответ. Я вот не понимаю, зачем он нужен. Мне он нужен для определенных целей. Если я не прав и этот подход не соответствует моим ожиданиям, то для этого я и пришел на этот форум, чтобы совета испросить, а не знаний по народному творчеству и упражнений в остроумии
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556700
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichokмне он нужен, чтобы каким-либо образом идентифицировать строку, но не хранить в памяти сами строки, поскольку они могут быть очень длинными, при то, что сами строки нигде не используются
Можешь MD5 посчитать или по моему алгоритму 20971320 в UInt64, так вероятность повтора будет меньше, чем у 32-битной GetHashCode(), но 100% гарантии дать невозможно без полного сравнения срок.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556708
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichokrefregпропущено...
Примерно так выглядит твой ответ:
Код: c#
1.
2.
3.
Зачем нужен топор?

Мне он нужен, чтобы сварить кашу...



за что я люблю отечественные форумы, что на них вместо ответа начинают рассказывать какие мы умные, и насколько тупой автор. на том же stackoverflow держатся как-то корректнее. Грустно из-за этого...

Ну вот вы объясните, заем нужен хеш, а не топорами бросайтесь в ответ. Я вот не понимаю, зачем он нужен. Мне он нужен для определенных целей. Если я не прав и этот подход не соответствует моим ожиданиям, то для этого я и пришел на этот форум, чтобы совета испросить, а не знаний по народному творчеству и упражнений в остроумии
если вам надо знать, что такое хеш код и как он считается, вы так и спрашивайте, "Объясните мне, что такое хеш код и как он работает"?
вы задали этот вопрос? нет, вы задали другой вопрос, вам на него дали ответ
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556720
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

По поводу MD5 хеша уже думал, буду пробовать, все же лучше хранить строки поменьше
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556722
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

20971584
Вообще-то я задавал такой вопрос...
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556727
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКак-то искал в инете хэши для строк, лучшее что нашлось:
Код: plaintext
1.
2.
3.
4.
5.
6.
hash_t hash32(const void* data, size_t len, hash_t prev = 0) {
	const char* str = (const char*) data;
	hash_t h = prev;
	while (len--) h = (h << 5) + h + *str++;
	return h;
}


Это на С, но под C# думаю несложно переписать.
Лучшее по какому критерию? Родной код, по-моему, тоже вполне:
Код: c#
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.
public override int GetHashCode() {

#if FEATURE_RANDOMIZED_STRING_HASHING
  if(HashHelpers.s_UseRandomizedStringHashing)
  {
    return InternalMarvin32HashString(this, this.Length, 0);
  }
#endif // FEATURE_RANDOMIZED_STRING_HASHING

  unsafe {
    fixed (char *src = this) {
      Contract.Assert(src[this.Length] == '\0', "src[this.Length] == '\\0'");
      Contract.Assert( ((int)src)%4 == 0, "Managed string should start at 4 bytes boundary");

#if WIN32
      int hash1 = (5381<<16) + 5381;
#else
      int hash1 = 5381;
#endif
      int hash2 = hash1;

#if WIN32
      // 32 bit machines.
      int* pint = (int *)src;
      int len = this.Length;
      while (len > 2)
      {
        hash1 = ((hash1 << 5) + hash1 + (hash1 >> 27)) ^ pint[0];
        hash2 = ((hash2 << 5) + hash2 + (hash2 >> 27)) ^ pint[1];
        pint += 2;
        len  -= 4;
      }

      if (len > 0)
      {
        hash1 = ((hash1 << 5) + hash1 + (hash1 >> 27)) ^ pint[0];
      }
#else
      int   c;
      char *s = src;
      while ((c = s[0]) != 0) {
        hash1 = ((hash1 << 5) + hash1) ^ c;
        c = s[1];
        if (c == 0)
          break;
        hash2 = ((hash2 << 5) + hash2) ^ c;
        s += 2;
      }
#endif
#if DEBUG
      // We want to ensure we can change our hash function daily.
      // This is perfectly fine as long as you don't persist the
      // value from GetHashCode to disk or count on String A 
      // hashing before string B.  Those are bugs in your code.
      hash1 ^= ThisAssembly.DailyBuildNumber;
#endif
      return hash1 + (hash2 * 1566083941);
    }
  }
}


_NovichokМне как раз нужна уникальность, что одна и та же строка будет иметь свой, уникальный, хеш, который не будет пересекаться с хешами других строк.
Это в приниципе невозможно - совокупность различных вариантов типа string является множеством, стремящимся к бесконечности, и ни одна хэш-функция к этой бесконечности не приблизится. Если принять как компромисс определенный процент коллизий, то берите любой криптохэш. SHA-256, например.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556730
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichok за что я люблю отечественные форумы, что на них вместо ответа начинают рассказывать какие мы умные, и насколько тупой автор. на том же stackoverflow держатся как-то корректнее. Грустно из-за этого...

Ну вот вы объясните, заем нужен хеш, а не топорами бросайтесь в ответ. Я вот не понимаю, зачем он нужен. Мне он нужен для определенных целей. Если я не прав и этот подход не соответствует моим ожиданиям, то для этого я и пришел на этот форум, чтобы совета испросить, а не знаний по народному творчеству и упражнений в остроумииНу не надо, оскорбления и в мыслях не было. Просто ты не читаешь, что тебе пишут. Поставил перед собой цель, и ничего кроме этой цели не видишь.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556735
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokНу вот вы объясните, заем нужен хеш, а не топорами бросайтесь в ответ. Я вот не понимаю, зачем он нужен.
Можешь тут почитать

_NovichokМне он нужен для определенных целей.
Вероятность задвоения MD5 крайне мала, на миллиарде строк может пара попадется с одинаковым, но 100% гарантии нет что эта пара не окажется среди тысячи строк.
Поэтому добавь в ТЗ пунктик что иногда прога может неправильно сработать и пользуйся.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556741
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T_NovichokНу вот вы объясните, заем нужен хеш, а не топорами бросайтесь в ответ. Я вот не понимаю, зачем он нужен.
Можешь тут почитать
До кучи:
https://blogs.msdn.microsoft.com/ruericlippert/2010/07/04/109-2/
https://habrahabr.ru/post/188038/
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556742
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichok,
Тебя спросили про конечную цель.
А ты начал обобщать как работают форумы.
Именно так и работают ))).
Добро пожаловать в интернет, если вышел из лесу.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556745
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. И да, хэш-функции не предназначаются, и никогда не предназначались для уникальной идентификации объектов.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556764
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregПоставил перед собой цель, и ничего кроме этой цели не видишь.
ну почему же не вижу? В самом первом сообщении написал:
_NovichokМожет кто посоветует какую-то альтернативу?
и в заголовке темы тоже

Пока приемлемой альтернативой считаю хеш MD5, тем более, что ранее такой подход у нас использовался, но был забыт
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556770
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Добро пожаловать в интернет, если вышел из лесу.
Ну, не нужно, не нужно опускаться до такого уровня...
Давайте уважать друг друга
Профессионализм человека заключается не только в умении запилить какую-то тулзовину, а еще и в умении культурного общения с коллегами по цеху, даже если эти коллеги знают меньше, чем вы
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556771
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokrefregПоставил перед собой цель, и ничего кроме этой цели не видишь.
ну почему же не вижу? В самом первом сообщении написал:
_NovichokМожет кто посоветует какую-то альтернативу?
и в заголовке темы тоже

Пока приемлемой альтернативой считаю хеш MD5 , тем более, что ранее такой подход у нас использовался, но был забытО чем и речь...
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556804
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichok,
Вы обиделись на сравнение вашего обоснавания с кашей из топора.
И пошли рассуждать о форумах.
Вот и всё.
А он был прав. По вашим словам, ваша цель - экономия оперативки.
Тут нет генералов. Все одинаковы как в бане).
Удачи Вам.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556858
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Не обижался я ни на кого, и дело не в этом.
Просто вместо разговора по делу начинаются размышления не по делу. Я не прав - так и скажите, что не прав (я не самодур, и смогу признать если не прав), но каша из топора - конечно интересное сравнение, но в то же время сомнительный аргумент, не дающий понимания, почему я не прав.

По поводу форумов, извините, не из лесу вышел (да здравствует Petro123) и данная тема не первая, где авторы топиков подымают данный вопрос.
Petro123По вашим словам, ваша цель - экономия оперативки
не только, и это было обозначено в самом первом сообщении
_NovichokМожет кто посоветует какую-то альтернативу? Ну и, конечно, подход должен быть достаточно быстрым .

А теперь по делу: попробовал MD5 хеш, не подходит, поскольку нагружает процессор и использует памяти не на много меньше, и расчеты идут достаточно медленно
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556906
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokА теперь по делу: попробовал MD5 хеш, не подходит, поскольку нагружает процессор и использует памяти не на много меньше, и расчеты идут достаточно медленно
Мой вариант не заинтересовал? 20971320
Если вместо hash_t взять UInt64 то получится 64-битный хэш и считать будет быстро, т.к. не требуется конвертации в Byte[].
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556907
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokА теперь по делу: попробовал MD5Флудер вы. У вас по делу 15% текста.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556912
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichok,

Сформулируй проблему без хеша (может новую тему?). Пока не совсем понятно, зачем тебе строки в памяти. Зачем их идентифицировать? Что потом с идентификаторами делать? Вынимается ли потом нормальная строка по идентификатору?
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556914
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichokэто было обозначено в самом первом сообщении
Для идей по архитектуре нужна цель по ТЗ.
Там ФУНКЦИОНАЛЬНЫЕ требования. А не память и процессор.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556918
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Флудер вы. У вас по делу 15% текста.
у вас вообще 0. Будем продолжать, или по делу общаться?
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556936
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregСформулируй проблему без хеша (может новую тему?). Пока не совсем понятно, зачем тебе строки в памяти. Зачем их идентифицировать? Что потом с идентификаторами делать? Вынимается ли потом нормальная строка по идентификатору?
Проблема в следующем:
В программе обрабатываются строки, строки могут быть и короткими по нескольку символов, а могут быть и десятки тысяч. Строки могут дублироваться, поэтому разумно обработать один раз строку и запомнить, что строка уже обрабатывалась. Когда приходит такая же строка, то выдается предыдущий результат. Из-за этого уменьшается время работы программы за счет обработки только уникальных строк. Чтобы запомнить строку, можно использовать ее в качестве того самого хеша, но т.к. строки могут быть длинными, то это будет больно бить по памяти. Сохраненное значение этой строки (или ее хеш) используется только для того, чтобы обозначить, что такая строка уже приходила. Соответственно и ищется подход для идентификации строки более легковесным ключом, чем сама строка. Время создания этого ключа тоже не должно быть продолжительным.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556941
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в строке текст обычный или base64\uue\mime код или подобное?
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556945
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

обычный человекочитаемый текст
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556953
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokКогда приходит такая же строка, то выдается предыдущий результат. Из-за этого уменьшается время работы программы за счет обработки только уникальных строк
Уже лучше после 2х страниц флуда.
Вы не сказали про хранилище строк.
Если оно есть, то есть ID и флаг обработки.
Или у вас сервис REST когда ничего не помните что делали со строками?
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556957
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И придумайте что вы делаете со строкой. Хотя бы размыв секретность и придумав Цель.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556958
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichok,

если это обычный текст, то используйте хеш, вероятность совпадения будет стремиться к 0, если страдаете паранойей используй 128 битный хеш.
если пренебречь этим нельзя, то при совпадении хеш кода добавляйте проверку, которая будет извлекать из хранилища строки и проверять их соответствие, вероятность такого события крайне мала, а значит на скорость работы это не окажет особого влияния. Выход только такой имхо.
как уже сказал, если строки очень большие, более 10кб, имеет смысл сжать их gzip'пом или еще чем.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556973
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes_Novichok,

если это обычный текст, то используйте хеш, вероятность совпадения будет стремиться к 0, если страдаете паранойей используй 128 битный хеш.
если пренебречь этим нельзя, то при совпадении хеш кода добавляйте проверку, которая будет извлекать из хранилища строки и проверять их соответствие, вероятность такого события крайне мала, а значит на скорость работы это не окажет особого влияния. Выход только такой имхо.
как уже сказал, если строки очень большие, более 10кб, имеет смысл сжать их gzip'пом или еще чем.
Поддерживаю.
Без хранилища строк, думаю не получится. Хотя если большие строки (например, больше 1кБ), приходят редко - то их, возможно, дешевле не хранить а еще раз обработать.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556975
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

эта часть программы не знает где и как обрабатывается строка.
это может быть Dictionary (ключом которого является ) или HashSet. Само наличие хеша или самой строки - это уже признак того, что строка была обработана
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556981
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichok(ключом которого является )
пардон, не дописал
ключом которого является или сама строка или ее хеш
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556987
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokПроблема в следующем:
В программе обрабатываются строки, строки могут быть и короткими по нескольку символов, а могут быть и десятки тысяч. Строки могут дублироваться, поэтому разумно обработать один раз строку и запомнить, что строка уже обрабатывалась. Когда приходит такая же строка, то выдается предыдущий результат. Из-за этого уменьшается время работы программы за счет обработки только уникальных строк. Чтобы запомнить строку, можно использовать ее в качестве того самого хеша, но т.к. строки могут быть длинными, то это будет больно бить по памяти. Сохраненное значение этой строки (или ее хеш) используется только для того, чтобы обозначить, что такая строка уже приходила. Соответственно и ищется подход для идентификации строки более легковесным ключом, чем сама строка. Время создания этого ключа тоже не должно быть продолжительным.
Тут еще бы статистику: строк в кэше, какая доля повторных запросов?

Как вариант: оставить родной 32-битный хэш, но дополнительно считать 64-битный хэш
Код: c#
1.
2.
3.
4.
5.
6.
7.
		static UInt64 Hash64(String str) {
			UInt64 h = 0;
			for(Int32 i = 0; i < str.Length; i++) {
				h = (h << 5) + h + str[i];
			}
			return h;
		}


По 64-битному дополнительная проверка, не совпало - отправка строки на обработку.
Можно и до 128 расширить: вторую половину считать при не нулевом h, например h = 123456789098765;
Но расширяя битность автоматом увеличиваешь занимаемую память.

Для управления памятью можно какой-нибудь спец.класс использовать. Например MemoryCache
Как вариант, можно посмотреть на готовые решения: Memcached
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556990
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да всё это бумагомарательство, автор пишет, что текст представляет собой обычный человеческий текст, значит уровень энтропии данных очень низкий и вероятность выпадания 2 строк с одинаковым хеш кодом крайне мала. Вы пытаетесь решать проблему, которой нет. Даже количество символов в человеческом тексте явно меньше 256\65536.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556992
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Novichok, а тебе не приходит в голову, что единственный хэш, гарантирующий соотношение 1 к 1 строки и его значения - это и есть сама строка? Если ты готов наложить ограничения, допустим будут использоваться только буквы, цифры и пара десятков спецсимволов, (т.е. не использовать 95% таблицы Unicode), хэш можно значительно уменьшить (в 10-15 раз), но его изготовление будет весьма затратной операцией.
Опять же: Если ты готов наложить ограничения, допустим будут использоваться только буквы, цифры и пара десятков спецсимволов, это уже 150 символов. Для строки, состоящей из 1..10 символов это 5е21 комбинаций, Log2(5е21) = 72.279, т.е. тип данных для уникального хэша уже должен занимать 73 бита, т.е. 10 байт.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556994
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesда всё это бумагомарательство, автор пишет, что текст представляет собой обычный человеческий текст, значит уровень энтропии данных очень низкий и вероятность выпадания 2 строк с одинаковым хеш кодом крайне мала. Вы пытаетесь решать проблему, которой нет. Даже количество символов в человеческом тексте явно меньше 256\65536.
Ту забыл количество символов в строке учесть, например если использовано 64 варианта символов, то комбинациями всего из 6 символов можно получить все возможные 32 битные хэши, для 64 надо 11 символов.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556995
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesВы пытаетесь решать проблему, которой нет.
+1
Если это человечий текст, то нужно пересмотреть постановку.
Повторы если и будут, то лично по недосмотру архитектора).
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39556998
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Если бы не было проблемы, то и не было бы темы, дубликаты были и довольно часто
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39557000
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Повторы если и будут, то лично по недосмотру архитектора).
Повторы допускаются спецификой программы
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39557019
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokPetro123Повторы если и будут, то лично по недосмотру архитектора).
Повторы допускаются спецификой программы
Кто берёт повторно на обработку?
Почему нет хранилища?
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39557020
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichok,
Отсутствие повторной обработки обеспечивает хранилище с индексом.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39557028
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Отсутствие повторной обработки обеспечивает хранилище с индексом.
обработка строк производится в нескольких параллельных потоках, в которых эти самые строки могут дублироваться. Чтобы не делать эту повторную обработку и создается своего рода кеш обработанных значений, который шарится между потоками.

В общем в виду сложности обеспечения быстрого, надежного и дешевого способа сделать выжимку из строки, принято решение, что для каждого потока свой маленький кеш будет, ключом которого и будет сама строка.

Всем спасибо.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39557031
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с делать нормальный конкурентный доступ к строкам, чтоб 2 потока не могли получить 1 строку не проще сделать?
потом не удивляйтесь, что на костылях далеко не уедет.
как вы гарантируйте в вашей многопоточной среде, что оба потока не захватят 1 и туже строку, пока идет обращение к маленькому кешу?
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39557041
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавьте синхронизацию, что в 1 момент времени только 1 поток мог получить строку и проблемы не будет
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39557042
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichokобработка строк производится в нескольких параллельных потоках, в которых эти самые строки могут дублироваться.
А я думал, откуда у вас повтор на обработку? )).
Вы сами сделали дубли распарралелив задачу. А темните, что дубли на входе)).
Вас всё равно трудно свернуть с Вашего решения.
Удачи).
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39557043
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesдобавьте синхронизацию, что в 1 момент времени только 1 поток мог получить строку и проблемы не будет
+1
Можно ещё искусственно нарезать куски каждому потоку.
В общем, Фаулер советует не допускать конкуренции без нужды).
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39557112
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Вы сами сделали дубли распараллелив задачу. А темните, что дубли на входе)).
я не скрывал этого, и уже говорил, что дубли строк допускаются. Ну специфика приложения такая. Ну разве я стал морочить голову из-за того, что не могу сделать выборку уникальных строк и обработать каждую отдельно? Если в параллельные потоки попадают дубликаты строк, значит это допустимо, и сразу скажу, оттуда их не представляется возможным убрать. и не в синхронизации проблема
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39557117
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokPetro123Вы сами сделали дубли распараллелив задачу. А темните, что дубли на входе)).
я не скрывал этого, и уже говорил, что дубли строк допускаются. Ну специфика приложения такая. Ну разве я стал морочить голову из-за того, что не могу сделать выборку уникальных строк и обработать каждую отдельно? Если в параллельные потоки попадают дубликаты строк, значит это допустимо, и сразу скажу, оттуда их не представляется возможным убрать. и не в синхронизации проблема
Недавно была пятничная тема про получение уникальных строк, посмотри , может что полезное найдешь.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39557132
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichok за что я люблю отечественные форумы, что на них вместо ответа начинают рассказывать какие мы умные, и насколько тупой автор. на том же stackoverflow держатся как-то корректнее. Грустно из-за этого...

Автор реально тупой и тугой, и это настолько очевидно, что подобное жалкое блеяние выглядит практически шедевром
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39557147
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

и где вы были раньше, чего так поздно подключились? Тема была бы интересней
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39557823
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokhVostt,

и где вы были раньше, чего так поздно подключились? Тема была бы интересней

"плохие отечественные форумы", где говорят правду в лицо и пытаются чему-то научить -- это уже китч.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558248
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если бы вы еще по делу выражались, и пытались чему-то научить. А так вы только пытаетесь правду-матку говорить в лицо.
По делу батенька, по делу: предложите новый способ быстро и надежно захешировать строку.
Или правду легче говорить?
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558294
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichokбыстро и надежно захешировать строку.GetHashCode() - это быстро и надежно. Проблема в том, что вы неверно понимаете термин хэш, и не хотите менять терминологию. Хэш неуникален по определению, а уникальное представление - это не хэш, это сама строка, либо ее сжатый без потерь вариант.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558305
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokИли правду легче говорить?
Это ваши слова?
авторДля чего нужен хеш?

мне он нужен, чтобы каким-либо образом идентифицировать строку, но не хранить в памяти сами строки, поскольку они могут быть очень длинными, при то, что сами строки нигде не используются
Учитесь говорить, прежде чем на форумы и не ту молодёжь пенять.
Вам дали 2 ссылки выше. Прочли?
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558347
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу GetHashCode() я уже давно понял, и искал альтернативы ему. Увы, быстрой и надежной альтернативы не нашел.
Остановились на использовании самой строки и ограничении кол-ва одновременных потоков для избежания чрезмерной нагрузки на память. Такой себе компромисный вариант. В пределах потока будут обрабатываться уникальные строки, ну а между потоками уже так и будет
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558348
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProGetHashCode() - это быстро и надежно
Быстро, но не надежно
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558351
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokБыстро, но не надежно
для поставленной задачи
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558412
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokShocker.ProGetHashCode() - это быстро и надежно
Быстро, но не надежно
Уже неоднократно написали что любой алгоритм хэша будет ненадежным идентификатором.
Совпадение хэша двух строк означает что строки вероятно одинаковы. И вероятность тем выше, чем выше битность хэша.
Т.е. строки равны при совпадении 128 бит MD5 намного вероятнее чем 32 бита GetHashCode(). Но 100% совпадения исходных строк ни один хэш не гарантирует.

PS Заменил у себя функцию 64-битного хэша (брал половину MD5) на эту 20972692 . Обработка 700 тыс. строк стала быстрее на 1.4 сек.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558426
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichok_NovichokБыстро, но не надежно
для поставленной задачи
Разве была задача без слова хэш-код?
Мало декларировать альтернативы, надо ещё и быть готовым их обсуждать.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558464
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sha256 тебе сгодится
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558491
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis.,

уже смотрел, наряду с md5 слишком медленный
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558495
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Petro123Разве была задача без слова хэш-код?
да что же вы к слову "хеш-код" прицепились? Ну вроде же прояснил задачу, зачем мне нужен этот код, а вы все цепляетесь к словам
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558501
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T_Novichokпропущено...

Быстро, но не надежно
Уже неоднократно написали что любой алгоритм хэша будет ненадежным идентификатором.
Совпадение хэша двух строк означает что строки вероятно одинаковы. И вероятность тем выше, чем выше битность хэша.
Т.е. строки равны при совпадении 128 бит MD5 намного вероятнее чем 32 бита GetHashCode(). Но 100% совпадения исходных строк ни один хэш не гарантирует.

PS Заменил у себя функцию 64-битного хэша (брал половину MD5) на эту 20972692 . Обработка 700 тыс. строк стала быстрее на 1.4 сек.
Применял разные алгоритмы создания хеша, но они только замедляют работу. А скорость в данном приложении критически важная. Увы, 1.4 сек - это очень и очень мало
Решили немного пожертвовать памятью и хранить сами строки
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558502
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichok,
1. Тебе не я, а профи советовали новый топик.
2. Ссылку прочёл выше?
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558526
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichokда что же вы к слову "хеш-код" прицепились?
Потому что ты сам опять пишешь:
_Novichokбыстро и надежно захешировать строку.то есть ты не хочешь признать неправоту при использовании термина и упорно продолжаешь его нам тулить
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558573
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokПо делу батенька, по делу: предложите новый способ быстро и надежно захешировать строку.

Судя по тому, что ты пишешь, ты сначала разберись что такое хеш вообще, прежде чем говорить про "быстро и надёжно". А то мозги колупаешь тут сам не зная чего хочешь.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558605
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_NovichokDima Tпропущено...

Уже неоднократно написали что любой алгоритм хэша будет ненадежным идентификатором.
Совпадение хэша двух строк означает что строки вероятно одинаковы. И вероятность тем выше, чем выше битность хэша.
Т.е. строки равны при совпадении 128 бит MD5 намного вероятнее чем 32 бита GetHashCode(). Но 100% совпадения исходных строк ни один хэш не гарантирует.

PS Заменил у себя функцию 64-битного хэша (брал половину MD5) на эту 20972692 . Обработка 700 тыс. строк стала быстрее на 1.4 сек.
Применял разные алгоритмы создания хеша, но они только замедляют работу. А скорость в данном приложении критически важная. Увы, 1.4 сек - это очень и очень мало
Решили немного пожертвовать памятью и хранить сами строки
1.4 сек сэкономлено из 5.3 сек на задаче где в т.ч. чтение из БД идет.

Вот замеры этого хэша 20817721 , поиск уникальных строк многопоточно идет со скоростью 200+ Мб/сек.

ИМХО если тебе действительно скорость важна, то расписывай всю задачу, а не ту маленькую часть, которая по твоему мнению может ускорить решение.

Кроме хэшей есть еще много чего интересного, например фильтр Блума возможно ускорит решение твоей задачи.
...
Рейтинг: 0 / 0
string.GetHashCode() - нужна альтернатива, гарантирующая результат
    #39558881
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Программирование всегда компромисс.

Если строк обрабатывается очень много, то ничего страшного, если некоторые не будут обработаны.
===========
В качестве хэша для данной задачи предлагаю структуру из трех обычных хэшей и длины строки :

Получить обычный кэш.
Делить строку на две и делать еще два.
...
Рейтинг: 0 / 0
81 сообщений из 81, показаны все 4 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / string.GetHashCode() - нужна альтернатива, гарантирующая результат
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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