Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: чудеса с crc32
 
 автор: Дмитрий Смаль   (09.12.2009 в 13:05)   письмо автору
 
 

Здравствуйте!
обнаружил интересную вещь с функцией crc32
у меня на компе стоит виндовс и денвер - crc32('admin') выдает результат -2012344970
на сервере стоит линукс и функция crc32('admin') выдает результат 2282622326

кто знает почему так получается?

и второй вопрос:
какие функции можно использовать для того, чтобы слово до 255 бит переделывало в число, которое помещалось бы в поле int в Mysql
это я к тому что число 2282622326 в поле int не влазит и надо его помещать в поле bigint
и ещё єта функция должна возвращать одинаковые результаты независимо от сервера и версии php

  Ответить  
 
 автор: Trianon   (09.12.2009 в 13:15)   письмо автору
 
   для: Дмитрий Смаль   (09.12.2009 в 13:05)
 

в пределах младших 32 бит результат одинаков, если Вы не заметили.
На линуксе, очевидно, 64-разрядная версия php

число 2282622326 в int не влазит. Но его Вам никто не возвращал.
А число -2282622326 в int влазит.

То есть, должна по идее. Но вот идеей никто никому не должен.

  Ответить  
 
 автор: Дмитрий Смаль   (09.12.2009 в 13:30)   письмо автору
 
   для: Trianon   (09.12.2009 в 13:15)
 

mysql_query ("SELECT crc32('admin')");
интерестно что это выдает как и на сервере 2282622326

я уточню свою проблему.
Для быстрого поиска пользователей в БД я решил из логина делать число, которое бы влазило в поле int.
Когда пользователь логинится, то его логин превращается в число, которое используется как индекс для поиска пользователя.
Вот я нарыл для этого функцию crc32, но пока она меня не устраивает.

если знаете функцию, которая из логина сделает число, что будет помещаться в int mysql, буду очень благодарен

P.S. такое число не обязательно должно быть уникальным

  Ответить  
 
 автор: Trianon   (09.12.2009 в 13:45)   письмо автору
 
   для: Дмитрий Смаль   (09.12.2009 в 13:30)
 

>mysql_query ("SELECT crc32('admin')");
>интерестно что это выдает как и на сервере 2282622326

Это MySQL. В нем существует тип UNSIGNED INT . В рамках этого типа и возвращается результат - этот конкретный результат. А клиенту (то есть в php) он передается вообще текстом.


>если знаете функцию, которая из логина сделает число, что будет помещаться в int mysql, буду очень благодарен

Так число-то помещается. crc32()
Можете привести к типу INT руками.
Можете сравнить - что на стороне SQL что на стороне php.

Вообще же для быстрого поиска в БД применяют индексы.

  Ответить  
 
 автор: Дмитрий Смаль   (09.12.2009 в 13:58)   письмо автору
 
   для: 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']))."'")) {

  Ответить  
 
 автор: Trianon   (09.12.2009 в 14:00)   письмо автору
 
   для: Дмитрий Смаль   (09.12.2009 в 13:58)
 

Вот из за этого quote_smart(transform_html я вынужден заткнуться.

  Ответить  
 
 автор: Дмитрий Смаль   (09.12.2009 в 14:05)   письмо автору
 
   для: 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']."'"))

у меня вопрос не по поводу дырок в запросах к БД а по поводу числового индекса логина

  Ответить  
 
 автор: Fractured#   (09.12.2009 в 13:17)   письмо автору
 
   для: Дмитрий Смаль   (09.12.2009 в 13:05)
 

На компе (локальном) у тебя может 64-битный процессор?
<?php

printf
('%u'crc32('admin'));

?> 


> какие функции можно использовать для того, чтобы слово до 255 бит

Такое огромное число и в BIGINT не влезет

  Ответить  
 
 автор: Trianon   (09.12.2009 в 13:24)   письмо автору
 
   для: Fractured#   (09.12.2009 в 13:17)
 

>На компе (локальном) у тебя может 64-битный процессор?

скорее таковой на сервере.

  Ответить  
 
 автор: Fractured#   (09.12.2009 в 15:03)   письмо автору
 
   для: Trianon   (09.12.2009 в 13:24)
 

> скорее таковой на сервере

Почему? Если число отрицательное в одном — старший бит единица. В другом же случае это не старший бит, поэтому оно не отрицательное.

У автора наоборот — отрицательное на локальной машине, извиняюсь.

  Ответить  
 
 автор: Дмитрий Смаль   (09.12.2009 в 13:53)   письмо автору
 
   для: 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?

  Ответить  
 
 автор: Fractured#   (09.12.2009 в 15:05)   письмо автору
 
   для: Дмитрий Смаль   (09.12.2009 в 13:53)
 

> вы имеете ввиду что результат crc32() по своей длине не влезет в BIGINT?

Я такого нигде не говорил и не имел ввиду. Результат CRC32 влезает в INT. Дело только в том какой INT — UNSIGNED или SIGNED.

  Ответить  
 
 автор: Trianon   (09.12.2009 в 16:07)   письмо автору
 
   для: Fractured#   (09.12.2009 в 15:05)
 

В любой влезет.
Т.к. crc - это фактически набор бит, а не число, ему все равно чем быть представленным.
Префекционист, безусловно, поместит его в 32битовый беззнаковый тип, а не найдя такого - расстроится. Утверждаю, как краевед.
Но если сильно припрет, то даже он смирится со знаковым представлением.

Между прочим исторически crc32 представляют беззнаковой шестнадцатеричкой строкой, и не исключено, что такой вариант автора устроит сам по себе, тем паче, что все инструменты для него и php и в MySQL имеются.

  Ответить  
 
 автор: Fractured#   (09.12.2009 в 17:41)   письмо автору
 
   для: Trianon   (09.12.2009 в 16:07)
 

> Т.к. crc - это фактически набор бит, а не число, ему все равно чем быть представленным.

Хорошо, скажем по-другому: да, CRC32 влезет в 4 байта, а его представление влезет не во всякое поле.

  Ответить  
 
 автор: Дмитрий Смаль   (09.12.2009 в 16:21)   письмо автору
 
   для: Fractured#   (09.12.2009 в 15:05)
 

спасибо с этим вопросом разобрался

для трианона
CRC32 влезает в INT только если UNSIGNED, в ином случае если результат больше чем 2 милиарда с копейками, то в поле просто запишется максимальнодопустимое значения поля - сам проверял (в данном случае это было на сервере, все числа били со знаком +, на локале же были и со знаком -, тогда влазили все)

  Ответить  
 
 автор: Fractured#   (09.12.2009 в 17:43)   письмо автору
 
   для: Дмитрий Смаль   (09.12.2009 в 16:21)
 

> CRC32 влезает в INT только если UNSIGNED

Ну а теперь попробуй UNSIGNED на локальной машине юзать. В половине случаев 0 получать будешь.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования