22

私のオンラインストアのすべての注文には、ユーザー向けの注文番号があります。それらを生成するための最良の方法を考えています。基準は次のとおりです。

  • 短い
  • 電話で簡単に言うことができます(たとえば、「m」と「n」はあいまいです)
  • 個性的
  • チェックサム(やり過ぎ?便利?)
  • 編集:注文の総数は明らかにされていません(顧客は3回目の注文をするのが不安になるかもしれません)

現在、次の方法を使用しています(チェックサムなし)。

def generate_number                
    possible_values = 'abfhijlqrstuxy'.upcase.split('') | '123456789'.split('')

    record = true
    while record
        random = Array.new(5){possible_values[rand(possible_values.size)]}.join
        record = Order.find(:first, :conditions => ["number = ?", random])
    end          
    self.number = random
end
4

13 に答える 13

3

私の元の場所では、次のとおりでした。

顧客 ID (1001 から始まる)、顧客が行った注文の順序、次に Orders テーブルの一意の ID。これにより、少なくとも 6 桁の長い数字が得られました。これは、2 つの主キーのために一意でした。

ダッシュやスペースを入れていただければ、お客様の購買傾向について少し洞察を得ることができると思います. 安全であることに問題はありません。注文 ID は推測可能であると思いますが、セキュリティ上のリスクがあるかどうかはわかりません。

于 2009-07-24T18:55:15.840 に答える
2

さて、これはどうですか?

続いて、ある番号(2468)から始めて、それに他の番号を追加します。たとえば、注文が行われた月の日を言います。

数は常に増加します(整数型の容量を超えるまでは、おそらく気にしないでしょう。信じられないほど成功し、遠く離れた島の楽園でマルガリータを飲みます)。それは実装するのに十分簡単であり、あなたが持っている注文の数についての推測を捨てるのに十分なものを混ぜ合わせます。

于 2009-07-24T18:57:17.990 に答える
2

番号を生成して保存するのではなく、システム内の注文数を明らかにしない暗号化バージョンを作成してみてください。まさにそれに関する記事です。

于 2009-07-24T20:22:10.877 に答える
2

Douglas Crockford の Base32 Encoding は、これに対して非常にうまく機能します。

http://www.crockford.com/wrmg/base32.html

ID 自体を自動インクリメント整数としてデータベースに保存し、100000 などの適切な大きさで開始し、エンコードされた値を顧客/インターフェースに公開します。

5 人のキャラクターが最初の 3,200 万件までの注文に対応し、非常に優れたパフォーマンスを発揮し、これらの要件のほとんどを満たします。ただし、似たような響きのキャラクターを除外することはできません。

于 2016-02-08T22:19:10.143 に答える
0

http://blog.logeek.fr/2009/7/2/creating-small-unique-tokens-in-ruby

>> rand(36**8).to_s(36)
=> "uur0cj2h"
于 2009-07-24T20:12:40.597 に答える
0

1から順番に?それの何がいけないの?

(注:この回答は、OPが質問を編集する前に提供されました。)

于 2009-07-24T18:46:09.213 に答える
0

郵便番号のようにできます: 2b2 b2b

そうすれば、ある種のチェックサムがあります(実際にはそうではありませんが、少なくとも2つの連続する数字または文字がある場合は間違っていることがわかります)。電話で簡単に読み取ることができ、システム内の注文数を示すものではありません.

于 2009-07-24T20:08:23.697 に答える