|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Добрый день. В документации метода 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. То есть разработчики не гарантируют одинакового результата на одинаковых строках. В принципе, я уже натолкнулся на это. Но очень нужен гарантированный результат. Может кто посоветует какую-то альтернативу? Ну и, конечно, подход должен быть достаточно быстрым. Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 10:47 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Как-то искал в инете хэши для строк, лучшее что нашлось: Код: plaintext 1. 2. 3. 4. 5. 6.
Это на С, но под C# думаю несложно переписать. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 10:56 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokТо есть разработчики не гарантируют одинакового результата на одинаковых строках.Это как раз гарантируется. Не гарантируется, что результат на разных строках будет разный (Т.е. две разные строки могут иметь одинаковый хеш). ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 10:56 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
refreg, ну как бы ни было, но такой сценарий меня не устраивает ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 11:05 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichokrefreg, ну как бы ни было, но такой сценарий меня не устраивает непонятно, чем? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 11:25 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichokну как бы ни было, но такой сценарий меня не устраиваетА как ты собираешься в 2^32 вариантов впихнуть гораздо большее количество вариантов, представляемых строками, и чтобы все уникальные были??? Int32 не резиновый ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 11:31 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
pation, ну тем, что две разные строки будут иметь одинаковый хеш. Мне как раз нужна уникальность, что одна и та же строка будет иметь свой, уникальный, хеш, который не будет пересекаться с хешами других строк. Из-за этого поведения string.GetHashCode() у меня программа выдает неправильные результаты ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 11:32 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokМне как раз нужна уникальность, что одна и та же строка будет иметь свой, уникальный, хеш, который не будет пересекаться с хешами других строк.Тогда это просто НЕ будет хэшем. Твой вариант - это использовать в качестве хэша саму строку. _NovichokИз-за этого поведения string.GetHashCode() у меня программа выдает неправильные результатыЭто не из-за его поведения, а из-за твоего непонимания, для чего вообще нужен хэш ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 11:35 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichok, После проверки равенства хешей проверяются равенства строк. Равенство хешей - это необходимое, но не достаточное условие. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 11:37 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Shocker.Pro, Shocker.ProА как ты собираешься в 2^32 вариантов впихнуть гораздо большее количество вариантов, представляемых строками, и чтобы все уникальные были??? Int32 не резиновый ну я собственно и спрашиваю _NovichokМожет кто посоветует какую-то альтернативу? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 11:41 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Shocker.ProЭто не из-за его поведения, а из-за твоего непонимания, для чего вообще нужен хэш Для чего нужен хеш? мне он нужен, чтобы каким-либо образом идентифицировать строку, но не хранить в памяти сами строки, поскольку они могут быть очень длинными, при то, что сами строки нигде не используются ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 11:43 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokShocker.ProЭто не из-за его поведения, а из-за твоего непонимания, для чего вообще нужен хэш Для чего нужен хеш? мне он нужен, чтобы каким-либо образом идентифицировать строку, но не хранить в памяти сами строки, поскольку они могут быть очень длинными, при то, что сами строки нигде не используютсяПримерно так выглядит твой ответ: Код: c# 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 11:52 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
есть только 1 алгоритм гарантирующий на 100% этот способ называется побитовое сравнение. других 100% способов не существует. В Dictionary для этого для каждого хеша может хранится больше 1го элемента на сколько я помню ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 11:56 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichokне хранить в памяти сами строки, поскольку они могут быть очень длинными А вы за машину сильно не переживайте. Пока нет оснований. Память кончилась? Есть СУБД. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 12:02 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
refreg, если они ни где не используются нафига они нужны? Сжимайте строки и сравнивайте их в сжатом виде. Если энтропия строки низкая, а размер большой, уровень сжатия может быть очень большим. Тем более, если они вам больше не нужны. Если высокая, то сжимать особо смысла нет конечно. Просто нужно хранить "таблицу" хеш сумм которая будет связана со строками и она должна быть один хеш ко многим строкам. Так вы сможете определить, что заданный хеш встречается только 1 раз и проверять побитно нет смысла. Если их более 1, нужно определить какая из строк равна, так же можно хранить несколько хешей, основанных на разных алгоритмах, вероятность того, что оба будут совпадать будет ничтожной или использовать алгоритмы большей битности. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 12:07 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
refreg_Novichokпропущено... Для чего нужен хеш? мне он нужен, чтобы каким-либо образом идентифицировать строку, но не хранить в памяти сами строки, поскольку они могут быть очень длинными, при то, что сами строки нигде не используютсяПримерно так выглядит твой ответ: Код: c# 1. 2. 3.
за что я люблю отечественные форумы, что на них вместо ответа начинают рассказывать какие мы умные, и насколько тупой автор. на том же stackoverflow держатся как-то корректнее. Грустно из-за этого... Ну вот вы объясните, заем нужен хеш, а не топорами бросайтесь в ответ. Я вот не понимаю, зачем он нужен. Мне он нужен для определенных целей. Если я не прав и этот подход не соответствует моим ожиданиям, то для этого я и пришел на этот форум, чтобы совета испросить, а не знаний по народному творчеству и упражнений в остроумии ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 12:09 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichokмне он нужен, чтобы каким-либо образом идентифицировать строку, но не хранить в памяти сами строки, поскольку они могут быть очень длинными, при то, что сами строки нигде не используются Можешь MD5 посчитать или по моему алгоритму 20971320 в UInt64, так вероятность повтора будет меньше, чем у 32-битной GetHashCode(), но 100% гарантии дать невозможно без полного сравнения срок. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 12:12 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichokrefregпропущено... Примерно так выглядит твой ответ: Код: c# 1. 2. 3.
за что я люблю отечественные форумы, что на них вместо ответа начинают рассказывать какие мы умные, и насколько тупой автор. на том же stackoverflow держатся как-то корректнее. Грустно из-за этого... Ну вот вы объясните, заем нужен хеш, а не топорами бросайтесь в ответ. Я вот не понимаю, зачем он нужен. Мне он нужен для определенных целей. Если я не прав и этот подход не соответствует моим ожиданиям, то для этого я и пришел на этот форум, чтобы совета испросить, а не знаний по народному творчеству и упражнений в остроумии если вам надо знать, что такое хеш код и как он считается, вы так и спрашивайте, "Объясните мне, что такое хеш код и как он работает"? вы задали этот вопрос? нет, вы задали другой вопрос, вам на него дали ответ ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 12:16 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Dima T, По поводу MD5 хеша уже думал, буду пробовать, все же лучше хранить строки поменьше ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 12:30 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 12:32 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Dima TКак-то искал в инете хэши для строк, лучшее что нашлось: Код: plaintext 1. 2. 3. 4. 5. 6.
Это на С, но под 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.
_NovichokМне как раз нужна уникальность, что одна и та же строка будет иметь свой, уникальный, хеш, который не будет пересекаться с хешами других строк. Это в приниципе невозможно - совокупность различных вариантов типа string является множеством, стремящимся к бесконечности, и ни одна хэш-функция к этой бесконечности не приблизится. Если принять как компромисс определенный процент коллизий, то берите любой криптохэш. SHA-256, например. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 12:35 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichok за что я люблю отечественные форумы, что на них вместо ответа начинают рассказывать какие мы умные, и насколько тупой автор. на том же stackoverflow держатся как-то корректнее. Грустно из-за этого... Ну вот вы объясните, заем нужен хеш, а не топорами бросайтесь в ответ. Я вот не понимаю, зачем он нужен. Мне он нужен для определенных целей. Если я не прав и этот подход не соответствует моим ожиданиям, то для этого я и пришел на этот форум, чтобы совета испросить, а не знаний по народному творчеству и упражнений в остроумииНу не надо, оскорбления и в мыслях не было. Просто ты не читаешь, что тебе пишут. Поставил перед собой цель, и ничего кроме этой цели не видишь. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 12:39 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokНу вот вы объясните, заем нужен хеш, а не топорами бросайтесь в ответ. Я вот не понимаю, зачем он нужен. Можешь тут почитать _NovichokМне он нужен для определенных целей. Вероятность задвоения MD5 крайне мала, на миллиарде строк может пара попадется с одинаковым, но 100% гарантии нет что эта пара не окажется среди тысячи строк. Поэтому добавь в ТЗ пунктик что иногда прога может неправильно сработать и пользуйся. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 12:41 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Dima T_NovichokНу вот вы объясните, заем нужен хеш, а не топорами бросайтесь в ответ. Я вот не понимаю, зачем он нужен. Можешь тут почитать До кучи: https://blogs.msdn.microsoft.com/ruericlippert/2010/07/04/109-2/ https://habrahabr.ru/post/188038/ ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 12:45 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichok, Тебя спросили про конечную цель. А ты начал обобщать как работают форумы. Именно так и работают ))). Добро пожаловать в интернет, если вышел из лесу. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 12:45 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
P.S. И да, хэш-функции не предназначаются, и никогда не предназначались для уникальной идентификации объектов. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 12:48 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
refregПоставил перед собой цель, и ничего кроме этой цели не видишь. ну почему же не вижу? В самом первом сообщении написал: _NovichokМожет кто посоветует какую-то альтернативу? и в заголовке темы тоже Пока приемлемой альтернативой считаю хеш MD5, тем более, что ранее такой подход у нас использовался, но был забыт ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 13:00 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Petro123Добро пожаловать в интернет, если вышел из лесу. Ну, не нужно, не нужно опускаться до такого уровня... Давайте уважать друг друга Профессионализм человека заключается не только в умении запилить какую-то тулзовину, а еще и в умении культурного общения с коллегами по цеху, даже если эти коллеги знают меньше, чем вы ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 13:09 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokrefregПоставил перед собой цель, и ничего кроме этой цели не видишь. ну почему же не вижу? В самом первом сообщении написал: _NovichokМожет кто посоветует какую-то альтернативу? и в заголовке темы тоже Пока приемлемой альтернативой считаю хеш MD5 , тем более, что ранее такой подход у нас использовался, но был забытО чем и речь... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 13:09 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichok, Вы обиделись на сравнение вашего обоснавания с кашей из топора. И пошли рассуждать о форумах. Вот и всё. А он был прав. По вашим словам, ваша цель - экономия оперативки. Тут нет генералов. Все одинаковы как в бане). Удачи Вам. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 13:42 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Petro123, Не обижался я ни на кого, и дело не в этом. Просто вместо разговора по делу начинаются размышления не по делу. Я не прав - так и скажите, что не прав (я не самодур, и смогу признать если не прав), но каша из топора - конечно интересное сравнение, но в то же время сомнительный аргумент, не дающий понимания, почему я не прав. По поводу форумов, извините, не из лесу вышел (да здравствует Petro123) и данная тема не первая, где авторы топиков подымают данный вопрос. Petro123По вашим словам, ваша цель - экономия оперативки не только, и это было обозначено в самом первом сообщении _NovichokМожет кто посоветует какую-то альтернативу? Ну и, конечно, подход должен быть достаточно быстрым . А теперь по делу: попробовал MD5 хеш, не подходит, поскольку нагружает процессор и использует памяти не на много меньше, и расчеты идут достаточно медленно ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 14:19 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokА теперь по делу: попробовал MD5 хеш, не подходит, поскольку нагружает процессор и использует памяти не на много меньше, и расчеты идут достаточно медленно Мой вариант не заинтересовал? 20971320 Если вместо hash_t взять UInt64 то получится 64-битный хэш и считать будет быстро, т.к. не требуется конвертации в Byte[]. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 14:44 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokА теперь по делу: попробовал MD5Флудер вы. У вас по делу 15% текста. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 14:44 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichok, Сформулируй проблему без хеша (может новую тему?). Пока не совсем понятно, зачем тебе строки в памяти. Зачем их идентифицировать? Что потом с идентификаторами делать? Вынимается ли потом нормальная строка по идентификатору? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 14:47 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichokэто было обозначено в самом первом сообщении Для идей по архитектуре нужна цель по ТЗ. Там ФУНКЦИОНАЛЬНЫЕ требования. А не память и процессор. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 14:48 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Petro123Флудер вы. У вас по делу 15% текста. у вас вообще 0. Будем продолжать, или по делу общаться? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 14:54 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
refregСформулируй проблему без хеша (может новую тему?). Пока не совсем понятно, зачем тебе строки в памяти. Зачем их идентифицировать? Что потом с идентификаторами делать? Вынимается ли потом нормальная строка по идентификатору? Проблема в следующем: В программе обрабатываются строки, строки могут быть и короткими по нескольку символов, а могут быть и десятки тысяч. Строки могут дублироваться, поэтому разумно обработать один раз строку и запомнить, что строка уже обрабатывалась. Когда приходит такая же строка, то выдается предыдущий результат. Из-за этого уменьшается время работы программы за счет обработки только уникальных строк. Чтобы запомнить строку, можно использовать ее в качестве того самого хеша, но т.к. строки могут быть длинными, то это будет больно бить по памяти. Сохраненное значение этой строки (или ее хеш) используется только для того, чтобы обозначить, что такая строка уже приходила. Соответственно и ищется подход для идентификации строки более легковесным ключом, чем сама строка. Время создания этого ключа тоже не должно быть продолжительным. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 15:07 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
в строке текст обычный или base64\uue\mime код или подобное? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 15:12 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Roman Mejtes, обычный человекочитаемый текст ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 15:17 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokКогда приходит такая же строка, то выдается предыдущий результат. Из-за этого уменьшается время работы программы за счет обработки только уникальных строк Уже лучше после 2х страниц флуда. Вы не сказали про хранилище строк. Если оно есть, то есть ID и флаг обработки. Или у вас сервис REST когда ничего не помните что делали со строками? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 15:28 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
И придумайте что вы делаете со строкой. Хотя бы размыв секретность и придумав Цель. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 15:30 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichok, если это обычный текст, то используйте хеш, вероятность совпадения будет стремиться к 0, если страдаете паранойей используй 128 битный хеш. если пренебречь этим нельзя, то при совпадении хеш кода добавляйте проверку, которая будет извлекать из хранилища строки и проверять их соответствие, вероятность такого события крайне мала, а значит на скорость работы это не окажет особого влияния. Выход только такой имхо. как уже сказал, если строки очень большие, более 10кб, имеет смысл сжать их gzip'пом или еще чем. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 15:32 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Roman Mejtes_Novichok, если это обычный текст, то используйте хеш, вероятность совпадения будет стремиться к 0, если страдаете паранойей используй 128 битный хеш. если пренебречь этим нельзя, то при совпадении хеш кода добавляйте проверку, которая будет извлекать из хранилища строки и проверять их соответствие, вероятность такого события крайне мала, а значит на скорость работы это не окажет особого влияния. Выход только такой имхо. как уже сказал, если строки очень большие, более 10кб, имеет смысл сжать их gzip'пом или еще чем. Поддерживаю. Без хранилища строк, думаю не получится. Хотя если большие строки (например, больше 1кБ), приходят редко - то их, возможно, дешевле не хранить а еще раз обработать. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 15:49 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Petro123, эта часть программы не знает где и как обрабатывается строка. это может быть Dictionary (ключом которого является ) или HashSet. Само наличие хеша или самой строки - это уже признак того, что строка была обработана ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 15:54 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichok(ключом которого является ) пардон, не дописал ключом которого является или сама строка или ее хеш ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 15:58 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokПроблема в следующем: В программе обрабатываются строки, строки могут быть и короткими по нескольку символов, а могут быть и десятки тысяч. Строки могут дублироваться, поэтому разумно обработать один раз строку и запомнить, что строка уже обрабатывалась. Когда приходит такая же строка, то выдается предыдущий результат. Из-за этого уменьшается время работы программы за счет обработки только уникальных строк. Чтобы запомнить строку, можно использовать ее в качестве того самого хеша, но т.к. строки могут быть длинными, то это будет больно бить по памяти. Сохраненное значение этой строки (или ее хеш) используется только для того, чтобы обозначить, что такая строка уже приходила. Соответственно и ищется подход для идентификации строки более легковесным ключом, чем сама строка. Время создания этого ключа тоже не должно быть продолжительным. Тут еще бы статистику: строк в кэше, какая доля повторных запросов? Как вариант: оставить родной 32-битный хэш, но дополнительно считать 64-битный хэш Код: c# 1. 2. 3. 4. 5. 6. 7.
По 64-битному дополнительная проверка, не совпало - отправка строки на обработку. Можно и до 128 расширить: вторую половину считать при не нулевом h, например h = 123456789098765; Но расширяя битность автоматом увеличиваешь занимаемую память. Для управления памятью можно какой-нибудь спец.класс использовать. Например MemoryCache Как вариант, можно посмотреть на готовые решения: Memcached ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 16:05 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
да всё это бумагомарательство, автор пишет, что текст представляет собой обычный человеческий текст, значит уровень энтропии данных очень низкий и вероятность выпадания 2 строк с одинаковым хеш кодом крайне мала. Вы пытаетесь решать проблему, которой нет. Даже количество символов в человеческом тексте явно меньше 256\65536. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 16:08 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichok, а тебе не приходит в голову, что единственный хэш, гарантирующий соотношение 1 к 1 строки и его значения - это и есть сама строка? Если ты готов наложить ограничения, допустим будут использоваться только буквы, цифры и пара десятков спецсимволов, (т.е. не использовать 95% таблицы Unicode), хэш можно значительно уменьшить (в 10-15 раз), но его изготовление будет весьма затратной операцией. Опять же: Если ты готов наложить ограничения, допустим будут использоваться только буквы, цифры и пара десятков спецсимволов, это уже 150 символов. Для строки, состоящей из 1..10 символов это 5е21 комбинаций, Log2(5е21) = 72.279, т.е. тип данных для уникального хэша уже должен занимать 73 бита, т.е. 10 байт. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 16:15 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Roman Mejtesда всё это бумагомарательство, автор пишет, что текст представляет собой обычный человеческий текст, значит уровень энтропии данных очень низкий и вероятность выпадания 2 строк с одинаковым хеш кодом крайне мала. Вы пытаетесь решать проблему, которой нет. Даже количество символов в человеческом тексте явно меньше 256\65536. Ту забыл количество символов в строке учесть, например если использовано 64 варианта символов, то комбинациями всего из 6 символов можно получить все возможные 32 битные хэши, для 64 надо 11 символов. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 16:16 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Roman MejtesВы пытаетесь решать проблему, которой нет. +1 Если это человечий текст, то нужно пересмотреть постановку. Повторы если и будут, то лично по недосмотру архитектора). ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 16:16 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Roman Mejtes, Если бы не было проблемы, то и не было бы темы, дубликаты были и довольно часто ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 16:20 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Petro123Повторы если и будут, то лично по недосмотру архитектора). Повторы допускаются спецификой программы ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 16:22 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokPetro123Повторы если и будут, то лично по недосмотру архитектора). Повторы допускаются спецификой программы Кто берёт повторно на обработку? Почему нет хранилища? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 16:38 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichok, Отсутствие повторной обработки обеспечивает хранилище с индексом. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 16:39 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Petro123Отсутствие повторной обработки обеспечивает хранилище с индексом. обработка строк производится в нескольких параллельных потоках, в которых эти самые строки могут дублироваться. Чтобы не делать эту повторную обработку и создается своего рода кеш обработанных значений, который шарится между потоками. В общем в виду сложности обеспечения быстрого, надежного и дешевого способа сделать выжимку из строки, принято решение, что для каждого потока свой маленький кеш будет, ключом которого и будет сама строка. Всем спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 16:48 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
с делать нормальный конкурентный доступ к строкам, чтоб 2 потока не могли получить 1 строку не проще сделать? потом не удивляйтесь, что на костылях далеко не уедет. как вы гарантируйте в вашей многопоточной среде, что оба потока не захватят 1 и туже строку, пока идет обращение к маленькому кешу? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 16:52 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
добавьте синхронизацию, что в 1 момент времени только 1 поток мог получить строку и проблемы не будет ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 17:03 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichokобработка строк производится в нескольких параллельных потоках, в которых эти самые строки могут дублироваться. А я думал, откуда у вас повтор на обработку? )). Вы сами сделали дубли распарралелив задачу. А темните, что дубли на входе)). Вас всё равно трудно свернуть с Вашего решения. Удачи). ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 17:03 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Roman Mejtesдобавьте синхронизацию, что в 1 момент времени только 1 поток мог получить строку и проблемы не будет +1 Можно ещё искусственно нарезать куски каждому потоку. В общем, Фаулер советует не допускать конкуренции без нужды). ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 17:06 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Petro123Вы сами сделали дубли распараллелив задачу. А темните, что дубли на входе)). я не скрывал этого, и уже говорил, что дубли строк допускаются. Ну специфика приложения такая. Ну разве я стал морочить голову из-за того, что не могу сделать выборку уникальных строк и обработать каждую отдельно? Если в параллельные потоки попадают дубликаты строк, значит это допустимо, и сразу скажу, оттуда их не представляется возможным убрать. и не в синхронизации проблема ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 18:53 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokPetro123Вы сами сделали дубли распараллелив задачу. А темните, что дубли на входе)). я не скрывал этого, и уже говорил, что дубли строк допускаются. Ну специфика приложения такая. Ну разве я стал морочить голову из-за того, что не могу сделать выборку уникальных строк и обработать каждую отдельно? Если в параллельные потоки попадают дубликаты строк, значит это допустимо, и сразу скажу, оттуда их не представляется возможным убрать. и не в синхронизации проблема Недавно была пятничная тема про получение уникальных строк, посмотри , может что полезное найдешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 19:15 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichok за что я люблю отечественные форумы, что на них вместо ответа начинают рассказывать какие мы умные, и насколько тупой автор. на том же stackoverflow держатся как-то корректнее. Грустно из-за этого... Автор реально тупой и тугой, и это настолько очевидно, что подобное жалкое блеяние выглядит практически шедевром ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 19:50 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
hVostt, и где вы были раньше, чего так поздно подключились? Тема была бы интересней ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2017, 20:24 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokhVostt, и где вы были раньше, чего так поздно подключились? Тема была бы интересней "плохие отечественные форумы", где говорят правду в лицо и пытаются чему-то научить -- это уже китч. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 19:50 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
если бы вы еще по делу выражались, и пытались чему-то научить. А так вы только пытаетесь правду-матку говорить в лицо. По делу батенька, по делу: предложите новый способ быстро и надежно захешировать строку. Или правду легче говорить? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 13:54 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichokбыстро и надежно захешировать строку.GetHashCode() - это быстро и надежно. Проблема в том, что вы неверно понимаете термин хэш, и не хотите менять терминологию. Хэш неуникален по определению, а уникальное представление - это не хэш, это сама строка, либо ее сжатый без потерь вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 14:31 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokИли правду легче говорить? Это ваши слова? авторДля чего нужен хеш? мне он нужен, чтобы каким-либо образом идентифицировать строку, но не хранить в памяти сами строки, поскольку они могут быть очень длинными, при то, что сами строки нигде не используются Учитесь говорить, прежде чем на форумы и не ту молодёжь пенять. Вам дали 2 ссылки выше. Прочли? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 14:36 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
По поводу GetHashCode() я уже давно понял, и искал альтернативы ему. Увы, быстрой и надежной альтернативы не нашел. Остановились на использовании самой строки и ограничении кол-ва одновременных потоков для избежания чрезмерной нагрузки на память. Такой себе компромисный вариант. В пределах потока будут обрабатываться уникальные строки, ну а между потоками уже так и будет ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 15:13 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Shocker.ProGetHashCode() - это быстро и надежно Быстро, но не надежно ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 15:13 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokБыстро, но не надежно для поставленной задачи ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 15:14 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokShocker.ProGetHashCode() - это быстро и надежно Быстро, но не надежно Уже неоднократно написали что любой алгоритм хэша будет ненадежным идентификатором. Совпадение хэша двух строк означает что строки вероятно одинаковы. И вероятность тем выше, чем выше битность хэша. Т.е. строки равны при совпадении 128 бит MD5 намного вероятнее чем 32 бита GetHashCode(). Но 100% совпадения исходных строк ни один хэш не гарантирует. PS Заменил у себя функцию 64-битного хэша (брал половину MD5) на эту 20972692 . Обработка 700 тыс. строк стала быстрее на 1.4 сек. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 15:54 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichok_NovichokБыстро, но не надежно для поставленной задачи Разве была задача без слова хэш-код? Мало декларировать альтернативы, надо ещё и быть готовым их обсуждать. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 16:02 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
sha256 тебе сгодится ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 16:47 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Denis., уже смотрел, наряду с md5 слишком медленный ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 17:21 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Petro123, Petro123Разве была задача без слова хэш-код? да что же вы к слову "хеш-код" прицепились? Ну вроде же прояснил задачу, зачем мне нужен этот код, а вы все цепляетесь к словам ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 17:30 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Dima T_Novichokпропущено... Быстро, но не надежно Уже неоднократно написали что любой алгоритм хэша будет ненадежным идентификатором. Совпадение хэша двух строк означает что строки вероятно одинаковы. И вероятность тем выше, чем выше битность хэша. Т.е. строки равны при совпадении 128 бит MD5 намного вероятнее чем 32 бита GetHashCode(). Но 100% совпадения исходных строк ни один хэш не гарантирует. PS Заменил у себя функцию 64-битного хэша (брал половину MD5) на эту 20972692 . Обработка 700 тыс. строк стала быстрее на 1.4 сек. Применял разные алгоритмы создания хеша, но они только замедляют работу. А скорость в данном приложении критически важная. Увы, 1.4 сек - это очень и очень мало Решили немного пожертвовать памятью и хранить сами строки ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 17:34 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichok, 1. Тебе не я, а профи советовали новый топик. 2. Ссылку прочёл выше? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 17:34 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_Novichokда что же вы к слову "хеш-код" прицепились? Потому что ты сам опять пишешь: _Novichokбыстро и надежно захешировать строку.то есть ты не хочешь признать неправоту при использовании термина и упорно продолжаешь его нам тулить ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 17:52 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokПо делу батенька, по делу: предложите новый способ быстро и надежно захешировать строку. Судя по тому, что ты пишешь, ты сначала разберись что такое хеш вообще, прежде чем говорить про "быстро и надёжно". А то мозги колупаешь тут сам не зная чего хочешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 19:02 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
_NovichokDima Tпропущено... Уже неоднократно написали что любой алгоритм хэша будет ненадежным идентификатором. Совпадение хэша двух строк означает что строки вероятно одинаковы. И вероятность тем выше, чем выше битность хэша. Т.е. строки равны при совпадении 128 бит MD5 намного вероятнее чем 32 бита GetHashCode(). Но 100% совпадения исходных строк ни один хэш не гарантирует. PS Заменил у себя функцию 64-битного хэша (брал половину MD5) на эту 20972692 . Обработка 700 тыс. строк стала быстрее на 1.4 сек. Применял разные алгоритмы создания хеша, но они только замедляют работу. А скорость в данном приложении критически важная. Увы, 1.4 сек - это очень и очень мало Решили немного пожертвовать памятью и хранить сами строки 1.4 сек сэкономлено из 5.3 сек на задаче где в т.ч. чтение из БД идет. Вот замеры этого хэша 20817721 , поиск уникальных строк многопоточно идет со скоростью 200+ Мб/сек. ИМХО если тебе действительно скорость важна, то расписывай всю задачу, а не ту маленькую часть, которая по твоему мнению может ускорить решение. Кроме хэшей есть еще много чего интересного, например фильтр Блума возможно ускорит решение твоей задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2017, 20:34 |
|
string.GetHashCode() - нужна альтернатива, гарантирующая результат
|
|||
---|---|---|---|
#18+
Программирование всегда компромисс. Если строк обрабатывается очень много, то ничего страшного, если некоторые не будут обработаны. =========== В качестве хэша для данной задачи предлагаю структуру из трех обычных хэшей и длины строки : Получить обычный кэш. Делить строку на две и делать еще два. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2017, 11:55 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1399602]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
106ms |
get tp. blocked users: |
2ms |
others: | 334ms |
total: | 532ms |
0 / 0 |