Идеи создать маленькое (<10 цифр), не (очень) безопасный “хеш”

Получение итоговых строк в результате запроса ...

Вы можете просто повторить результат и посчитать их. Вы не говорите, какой язык или клиентскую библиотеку вы используете, но API предоставляет функцию mysql_num_rows , которая может сообщить вам количество строк в результате.

Это представлено в PHP, например, как функция mysqli_num_rows . Когда вы отредактировали вопрос, упомянув, что используете PHP, вот простой пример использования функций mysqli:

$link = mysqli_connect("localhost", "user", "password", "database");

$result = mysqli_query($link, "SELECT * FROM table1");
$num_rows = mysqli_num_rows($result);

echo "$num_rows Rows\n";

Получение количества строк, соответствующих некоторым критериям ...

Просто используйте COUNT (*) - см. Подсчет строк в руководстве по MySQL. Например:

SELECT COUNT(*) FROM foo WHERE bar= 'value';

Получить общее количество строк при использовании LIMIT ...

Если вы использовали предложение LIMIT, но хотите знать, сколько строк вы получите без него, используйте SQL_CALC_FOUND_ROWS в своем запросе, а затем SELECT FOUND_ROWS ();

SELECT SQL_CALC_FOUND_ROWS * FROM foo
   WHERE bar="value" 
   LIMIT 10;

SELECT FOUND_ROWS();

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

16
задан Alix Axel 15 July 2010 в 20:51
поделиться

7 ответов

Рассмотрим очень простую схему, основанную на сети Фейстеля, для перестановки, скажем, идентификационного номера билета. Это сообщение (которое, оказывается, есть в списках PostgreSQL, но на самом деле не имеет ничего общего с PostgreSQL) описывает простую сеть Фейстеля . На каждом билете вы можете напечатать идентификационный номер билета (выбирается последовательно), а затем «секретный код билета», который является результатом передачи идентификационного номера через сеть Фейстеля. Возможные варианты включают добавление контрольной цифры к секретному коду и основание ввода в сеть Фейстеля не только на последовательно сгенерированном числе (число + 10 000 * номер идентификатора события и т. Д.).

1
ответ дан 30 November 2019 в 22:10
поделиться

Вы можете вычислить CRC.

По сути, просто начните добавлять каждый символ в строку и ограничьте длину длинным целым числом.

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

Это будет два целых числа или восемь байтов.

0
ответ дан 30 November 2019 в 22:10
поделиться

Why reinvent the wheel? Just do something like this (Python Code, ask me if you need clarification):

import hashlib

secretpassword = "blah"

def createticket(eventnum, ticketnum):
    m = hashlib.md5() # or any crypto hash you like
    m.update("%s%s%s" % (eventnum, ticketnum, secretpassword))
    return m.hexdigest()[:10]

Example:

Event Number 1

Ticket Number 123

createticket(1,123)
# output: 2d7f242597

Mr ticketman comes around with his verifier and enters in the event/ticket number and the hash:

def verifier(eventnum, ticketnum, hash):
    return hash == createticket(eventnum, ticketnum)

verifier(1,123, "2d7f242597")
# ouput: True
12
ответ дан 30 November 2019 в 22:10
поделиться

Для проверки в автономном режиме я вижу только одно простое решение ..

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

Это позволяет вам ограничить размер идентификатора билета и иметь явно пропорциональную безопасность по отношению к размеру самого билета. идентификатор билета.

0
ответ дан 30 November 2019 в 22:10
поделиться

Я вижу два способа:

  1. Сгенерировать случайное число или, по крайней мере, случайную часть числа и сохранить его в центральной базе данных. Затем загрузите базу данных во все системы ворот для проверки.
  2. Число должно быть самодостаточным. Другими словами, номер должен иметь возможность выписки без сохраненного списка. Это похоже на некую систему контрольных сумм. Например, вы можете ввести числа от 1 и выше, сделать их 5-значными (00000-99999 = 100 000 чисел) и добавить 1-3 буквы, убедившись, что в итоге вы получите контрольную сумму, которая будет проверяться.
3
ответ дан 30 November 2019 в 22:10
поделиться

Предлагаю вам попробовать алгоритм Верхоффа .

5
ответ дан 30 November 2019 в 22:10
поделиться

Here's a scheme that has the advantage of letting you calculate the next ticket hash from the previous (so you can verify whether one is missing), but doesn't let outsiders calculate the next one:

Ticket.0 = substring(HASH(SALT + IV        ), 0, LENGTH)
Ticket.i = substring(HASH(SALT + Ticket.i-1), 0, LENGTH)

where

  • HASH is any hashing function that distributes its entropy relatively evenly across the output string
  • SALT is a constant you keep secret; it's a good idea to use a different one for each event
  • IV is another constant you keep secret
  • LENGTH is the length of the ticket ID you want (10 in your question, but 12 is not out of the question and gives you 256 times as many ticket IDs)
0
ответ дан 30 November 2019 в 22:10
поделиться