Получение int-представления String - PullRequest
5 голосов
/ 05 сентября 2008

Я ищу способ создания int \ long представления произвольной буквенно-цифровой строки. Хеш-коды этого не сделают, потому что я не могу позволить себе хеш-коллизии, т.е. представление должно быть уникальным и повторяемым

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

Любая другая идея, касающаяся более быстрого сравнения строк, также будет оценена по достоинству ...

Ответы [ 14 ]

0 голосов
/ 05 сентября 2008

Предполагая, что "буквенно-цифровые" означают буквы и цифры, вы можете рассматривать каждую букву / цифру как основную цифру 36. К сожалению, большие строки приведут к быстрому росту числа, и вам придется прибегать к большим целым числам, которые вряд ли эффективны.

Если ваши строки обычно отличаются при сравнении (то есть при поиске конкретной строки), хеш может быть вашим лучшим вариантом. Как только вы получите потенциальный удар, вы можете сделать сравнение строк, чтобы быть уверенным. Хорошо продуманный хэш сделает столкновения чрезвычайно редкими.

0 голосов
/ 05 сентября 2008

Если вы не хотите столкновений, попробуйте что-нибудь безумное, например, SHA-512. Я не могу гарантировать, что столкновений не будет, но я не думаю, что они еще нашли.

0 голосов
/ 05 сентября 2008

Насколько велики твои струны? Произвольно длинные строки не могут быть сжаты в 32/64 битном формате.

0 голосов
/ 05 сентября 2008

Как долго ваши строки? Если вы не выберете представление int, которое длиннее строки, столкновения всегда будут возможны, независимо от того, какое преобразование вы используете. Поэтому, если вы используете 32-разрядное целое число, вы можете уникально представлять только строки длиной до 4 байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...