powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / string.GetHashCode() - нужна альтернатива, гарантирующая результат
25 сообщений из 81, страница 1 из 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
25 сообщений из 81, страница 1 из 4
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / string.GetHashCode() - нужна альтернатива, гарантирующая результат
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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