|
|
|
| Здравствуйте!
обнаружил интересную вещь с функцией crc32
у меня на компе стоит виндовс и денвер - crc32('admin') выдает результат -2012344970
на сервере стоит линукс и функция crc32('admin') выдает результат 2282622326
кто знает почему так получается?
и второй вопрос:
какие функции можно использовать для того, чтобы слово до 255 бит переделывало в число, которое помещалось бы в поле int в Mysql
это я к тому что число 2282622326 в поле int не влазит и надо его помещать в поле bigint
и ещё єта функция должна возвращать одинаковые результаты независимо от сервера и версии php | |
|
|
|
|
|
|
|
для: Дмитрий Смаль
(09.12.2009 в 13:05)
| | в пределах младших 32 бит результат одинаков, если Вы не заметили.
На линуксе, очевидно, 64-разрядная версия php
число 2282622326 в int не влазит. Но его Вам никто не возвращал.
А число -2282622326 в int влазит.
То есть, должна по идее. Но вот идеей никто никому не должен. | |
|
|
|
|
|
|
|
для: Trianon
(09.12.2009 в 13:15)
| | mysql_query ("SELECT crc32('admin')");
интерестно что это выдает как и на сервере 2282622326
я уточню свою проблему.
Для быстрого поиска пользователей в БД я решил из логина делать число, которое бы влазило в поле int.
Когда пользователь логинится, то его логин превращается в число, которое используется как индекс для поиска пользователя.
Вот я нарыл для этого функцию crc32, но пока она меня не устраивает.
если знаете функцию, которая из логина сделает число, что будет помещаться в int mysql, буду очень благодарен
P.S. такое число не обязательно должно быть уникальным | |
|
|
|
|
|
|
|
для: Дмитрий Смаль
(09.12.2009 в 13:30)
| | >mysql_query ("SELECT crc32('admin')");
>интерестно что это выдает как и на сервере 2282622326
Это MySQL. В нем существует тип UNSIGNED INT . В рамках этого типа и возвращается результат - этот конкретный результат. А клиенту (то есть в php) он передается вообще текстом.
>если знаете функцию, которая из логина сделает число, что будет помещаться в int mysql, буду очень благодарен
Так число-то помещается. crc32()
Можете привести к типу INT руками.
Можете сравнить - что на стороне SQL что на стороне php.
Вообще же для быстрого поиска в БД применяют индексы. | |
|
|
|
|
|
|
|
для: Trianon
(09.12.2009 в 13:45)
| | то что индексы надо использовать при поиске в БД мне понятно
так же мне понятно что намного быстрее найти запись если индекс является числом
когда пользователь логинится, он вводит логин и пароль
получается что логин надо делать индексом и искать в базе
но когда пользователей несколько десятков а то и сотня тысяч, мне кажется что такой поиск будет грузить сервер, и поэтому я начал размышлять на тему того, что в БД хранить не только логин и пароль, а ещё цифровую запись, которая будет генерироваться из логина
и когда пользователь авторизируется, то запрос к БД будет не по логину как индексу, а цифровой записи, которая генерируется из логина.
типа вот так:
$result = mysql_query ("SELECT * FROM user WHERE login_id=".crc32($_SESSION['login'])." AND login='".quote_smart(transform_html($_SESSION['login']))."'")) { | |
|
|
|
|
|
|
|
для: Дмитрий Смаль
(09.12.2009 в 13:58)
| | Вот из за этого quote_smart(transform_html я вынужден заткнуться. | |
|
|
|
|
|
|
|
для: Trianon
(09.12.2009 в 14:00)
| | да ладно, quote_smart, transform_html - это функции которые убирают ненужные символы из логина
ну пусть будет $result = mysql_query ("SELECT * FROM user WHERE login_id=".crc32($_SESSION['login'])." AND login='".$_SESSION['login']."'"))
или пусть так
$result = mysql_query ("SELECT * FROM user WHERE login_id=".crc32($_POST['login'])." AND login='".$_POST['login']."'"))
у меня вопрос не по поводу дырок в запросах к БД а по поводу числового индекса логина | |
|
|
|
|
|
|
|
для: Дмитрий Смаль
(09.12.2009 в 13:05)
| | На компе (локальном) у тебя может 64-битный процессор?
<?php
printf('%u', crc32('admin'));
?>
|
> какие функции можно использовать для того, чтобы слово до 255 бит
Такое огромное число и в BIGINT не влезет | |
|
|
|
|
|
|
|
для: Fractured#
(09.12.2009 в 13:17)
| | >На компе (локальном) у тебя может 64-битный процессор?
скорее таковой на сервере. | |
|
|
|
|
|
|
|
для: Trianon
(09.12.2009 в 13:24)
| | > скорее таковой на сервере
Почему? Если число отрицательное в одном — старший бит единица. В другом же случае это не старший бит, поэтому оно не отрицательное.
У автора наоборот — отрицательное на локальной машине, извиняюсь. | |
|
|
|
|
|
|
|
для: Fractured#
(09.12.2009 в 13:17)
| | вы имеете ввиду что результат crc32() по своей длине не влезет в BIGINT?
вообще где можно узнать какая максимальная длина результата crc32()?
смотрел в википедии http://ru.wikipedia.org/wiki/%D0%A6%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B8%D0%B7%D0%B1%D1%8B%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4
Name : CRC 32
Width : 32 - это длина 32 бита?
если так, то возможно стоит использовать
Name : CRC 16
Width : 16
P.S.
затупил, в пхп нету функции CRC 16
короче вопрос какая длина будет в CRC32 ()?
всегда ли результат влезет в поле BIGINT? | |
|
|
|
|
|
|
|
для: Дмитрий Смаль
(09.12.2009 в 13:53)
| | > вы имеете ввиду что результат crc32() по своей длине не влезет в BIGINT?
Я такого нигде не говорил и не имел ввиду. Результат CRC32 влезает в INT. Дело только в том какой INT — UNSIGNED или SIGNED. | |
|
|
|
|
|
|
|
для: Fractured#
(09.12.2009 в 15:05)
| | В любой влезет.
Т.к. crc - это фактически набор бит, а не число, ему все равно чем быть представленным.
Префекционист, безусловно, поместит его в 32битовый беззнаковый тип, а не найдя такого - расстроится. Утверждаю, как краевед.
Но если сильно припрет, то даже он смирится со знаковым представлением.
Между прочим исторически crc32 представляют беззнаковой шестнадцатеричкой строкой, и не исключено, что такой вариант автора устроит сам по себе, тем паче, что все инструменты для него и php и в MySQL имеются. | |
|
|
|
|
|
|
|
для: Trianon
(09.12.2009 в 16:07)
| | > Т.к. crc - это фактически набор бит, а не число, ему все равно чем быть представленным.
Хорошо, скажем по-другому: да, CRC32 влезет в 4 байта, а его представление влезет не во всякое поле. | |
|
|
|
|
|
|
|
для: Fractured#
(09.12.2009 в 15:05)
| | спасибо с этим вопросом разобрался
для трианона
CRC32 влезает в INT только если UNSIGNED, в ином случае если результат больше чем 2 милиарда с копейками, то в поле просто запишется максимальнодопустимое значения поля - сам проверял (в данном случае это было на сервере, все числа били со знаком +, на локале же были и со знаком -, тогда влазили все) | |
|
|
|
|
|
|
|
для: Дмитрий Смаль
(09.12.2009 в 16:21)
| | > CRC32 влезает в INT только если UNSIGNED
Ну а теперь попробуй UNSIGNED на локальной машине юзать. В половине случаев 0 получать будешь. | |
|
|
|