12 января 2012 г.

Честное голосование

База данных, состоящая из одной таблицы со следующими полями:
  • идентификатор (ИД);
  • выбор пользователя.
"Идентификатор" уникален и либо вводится пользователем (любой набор символов), либо выбирается из предложенных системой. Система (база данных) не знает пользователя, поэтому не может предложить ему идентификатор, который бы был хоть как-то связан с его личностью, кроме как случайно.
"Выбор пользователя" - голос пользователя, выбирается из списка элементов, созданного в момент создания базы.

База данных создаётся тогда, когда все возможные варианты выбора определены.
База доступна всем и каждому в любой момент времени, начиная с момента создания и до голосования, которое будет после текущего. До начала голосования любой пользователь может проверить, что база пуста. В момент голосования и после - он может проверить свой голос, предоставить другим пользователям проверить его голос (если сообщит им свой ИД), проверить голоса других пользователей (если они предоставили ему свои ИД) и самое главное - пересчитать результаты голосования.
Для большей "честности" базу данных можно скопировать в любой момент на носитель пользователя (причём "в любой момент" означает, в том числе, в момент активного голосования других пользователей). Это позволит исключить попытки модификации базы в момент голосования и, конечно, после. На скопированной базе можно выполнить все те же проверки, что и на общей базе, но, дополнительно, можно сравнить голоса в скопированной базе с голосами в общедоступной или с голосами из другой скопированной базы (скопированной другим пользователем).

По данным Wikipedia, на 2011 год в России - 142 914 136 человек. Не такая уж это и большая база данных получится.

Недостатки:
  • Проблема ввода/выбора ИД - это чисто человеческая проблема: встречаются люди, которые не могут придумать уникальный набор символов :)
  • Компрометация системы. Возможна ситуация, когда пользователь до голосования сообщает, что его ИД будет таким-то и он так-то проголосует, но в момент совершения выбора (в кабинке) меняет голос (оставляя заранее выбранный ИД), после чего всем сообщает, что "вот! видите!". (Ситуацию с "занятым" ИД в момент совершения выбора можно решить, если пользователь заранее "забронирует" этот ИД.)