есть именно этот пример на wiki в http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject .
Хотя совсем недавно я предпочитал использовать @classmethod для этого вместо того, чтобы переопределять конструктор, поскольку явный лучше, чем неявный, также проще:
user.email = Email.as_unique('foo@bar.com')
(я на самом деле собираюсь обновить wiki, чтобы более полно представить варианты использования здесь)
Помимо трудностей реализации, стоимость поиска позиции n с множителем k составляет log (n) / log (k) + log ((k-1) n) + O (1) = log (n) / log (k) + log (n) + log (k-1) + O (1). Увеличивая k, мы можем сделать подход с постоянным множителем, но не достичь 1, но стоимость - это увеличение в постоянном члене. 2 работает достаточно хорошо, я полагаю.