2012-02-27 2 views
4

У меня есть таблица SQL, в которой используются строки для ключа. Мне нужно преобразовать эту строку (максимум 18 символов) в уникальное (!) 4-байтовое целое с помощью PHP. Может ли кто-нибудь помочь?Создайте уникальное 4-байтовое целое число из строки в PHP

+1

Как бы вы поместить 18-байтовое строку в 4-байтовое целое число? –

+0

Нет. Недостаточно 4-байтовых целых чисел для покрытия всех возможных строк. –

+0

18 символов строка имеет 18 байт. Вы сказали «_max._ 18 символов», таким образом, есть намного больше комбинаций, а затем 18 байт. Теперь вы хотите сжать 18 байтов в 4 байта. Это может работать некоторое время, но не долго. – KingCrunch

ответ

0

Храните таблицу поиска целых чисел. Каждый раз, когда вы сталкиваетесь с новой строкой, вы добавляете ее в таблицу сопоставления и присваиваете ей новый уникальный идентификатор. Это будет работать примерно на 2^32 строки, что, вероятно, достаточно.

Невозможно сделать это более чем для 2^32 различных строк.

+0

Не уникально, в конечном итоге произойдет столкновение. ОП запрашивает уникальное отображение. – Piskvor

+0

Это _is_ уникально. Для до 2^32 клавиш. Как я и сказал. Это практический ответ на теоретически неразрешимую проблему. Верно. – usr

+0

Хорошо, но разве вы не заново изобрели ключ автоинкремента SQL? – Piskvor

0

Вы не можете. Четырехбайтовое целое число может представлять 2^32 = 4 миллиарда значений, чего недостаточно для хранения вашего целевого пространства.

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

1

Уникальный? Невозможно, извините.

Давайте поближе:

С 18 символов, даже если мы предполагая только 128 возможных символов ASCII (7 бит), вы получите 128^18 возможных строк (и я не даже вдаваясь в возможность более коротких строк!), что составляет около 8E37 (8 и 37 нулей).

С 4-байтовым целым вы получаете 256^4 возможных целых чисел, что составляет около 4E9 (4 миллиарда).

Итак, у вас есть около 4E28 строк, чем у вас есть целые числа; вы не можете иметь уникальное отображение.

Таким образом, вы обязательно столкнетесь с столкновением, как только вы введете ключ 4294967297th, но вы можете столкнуться с ним, как только вы введете более одного.

Смотрите также: http://en.wikipedia.org/wiki/Pigeonhole_principle

Смежные вопросы