הזיהוי הראשוני שלך זה לפי המשתמש באתר. כאשר אני קונה בחנות וירטואלית, יש לי שם משתמש עם סיסמא, לעיתים ת.ז ואפילו כתובת מגורים דרכו אני מבצע את הקניות. עבור אותו שם משתמש (שנקבע באופן חח"ע לפי תעודת הזהות לצורך העניין) קל לי לעקוב אחר כמות הקניות, ואני לא צריך לשמור את כרטיס האשראי. גם אם אתה אומר "באתר שלי אין הרשמה למשתמשים" אז עדיין כרטיס אשראי מזוהה באופן חח"ע עם שם מסוים ועם תעודת זהות, אותם אתה יכול לשמור (בצורה מאובטחת) במסד הנתונים.
הבעיה נופלת אם וכאשר אתה מעוניין לשמור עבור ממש כל כרטיס אשראי את כמות הקניות שבוצעו דרכו, קרי אם לי יש 3 כרטיסי אשראי על השם שלי ועל תעודת הזהות שלי, אז תרצה לשמור את כמות הקניות עבור כל כרטיס אשראי באופן פרטני.
במקרה כנ"ל אפשר ליצור, כמו שאמרתי, סכמה קשוחה יותר:
לאחר הזיהוי מול תעודת הזהות של האדם, נבצע זיהוי על הכמות הבדידה והסופית של כרטיסי האשראי שלו. לשם כך ניתן לקחת סכום, לעשותו מודולו r באשר r סדר גודל של 10,000 או כל פעולה פשוטה יחסית שיכולה להבדיל בין כמות קטנה של כרטיסי אשראי בהסתברות קטנה. אם אתה רוצה להתעמק, אז עבור סכום ייתכן שנקבל התנגשויות בהסתברות גבוהה עבור מספר לא גדול של כרטיסי אשראי, אבל עבור מודולו r ובהנחת התפלגות אחידה על כרטיסי אשראי (מה שבקירוב, ככה"נ, נכון), נקבל שההסתברות של שני כרטיסי אשראי להתנגש היא r^-1 ובאופן כללי תצטרך sqrt(r) של כרטיסי אשראי כדי שבהסתברות של 50% תהיה התנגשות. בהנחה שלבן אדם אין יותר מ-20 כרטיסי אשראי, אפשר לקחת r ~ 10,000 ולקבל פתרון לא רע בכלל.
אפשרות נוספת, כמו שציינתי, היא להגריל לכל כרטיס אשראי k ביטים, לשמור את ה-bitflags שהוגרלו ובהינתן כרטיס אשראי חדש, להטיל אותו לרשומות כרטיסי האשראי של האדם שמשויך אליו בעזרת בדיקת המספרים היושבים ב-k הביטים שהוגרלו (+ הצפנה מסוימת).