web-dev-qa-db-ja.com

ユーザーの詳細に基づいてJavaScriptでランダムトークンを作成する

他のユーザーのトークンとの潜在的な競合を回避しながら、ユーザーを識別するために使用できるランダムな文字列(トークン)を作成したいと思います。

私が考えていたのは、トークンを生成するためのnavigator.userAgent + new Date().getTime()のMD5ハッシュでしたが、それをハッシュするにはJavascript MD5ライブラリ全体が必要であり、これは本当にやりたくありません。

A-Z/0-9文字で構成する必要があり、理想的には32文字を超えないようにします。私はすべてのアイデアを受け入れています。ありがとう!

ランダム文字列ジェネレーターを探していないことを明確にするために、ランダム文字列はJavascriptを介して利用可能なユーザー詳細から生成する必要があり、潜在的な競合を避けるために時間を使用することもできます!

26
fire

チェックアウト crypto.js プロジェクト。暗号化アルゴリズムのコレクション。プロジェクトには、ハッシュアルゴリズムごとに個別のjsファイルがあります。

5
Josnidhin

乱数を生成し、それを基数36(0-9a-z):

var Rand = function() {
    return Math.random().toString(36).substr(2); // remove `0.`
};

var token = function() {
    return Rand() + Rand(); // to make it longer
};

token(); // "bnh5yzdirjinqaorq0ox1tf383nb3xr"
107
pimvdb

この関数を使用すると、トークンの長さと許可される文字を設定できます。

function generate_token(length){
    //edit the token allowed characters
    var a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".split("");
    var b = [];  
    for (var i=0; i<length; i++) {
        var j = (Math.random() * (a.length-1)).toFixed(0);
        b[i] = a[j];
    }
    return b.join("");
}

Generate_tokenを呼び出すだけです

generate_token(32); //returns "qweQj4giRJSdMNzB8g1XIa6t3YtRIHPH"
7
Kareem

Kareem's に似たアプローチを使用しますが、パフォーマンスを大幅に向上させるために、関数呼び出しと組み込みの配列操作を減らします。

パフォーマンステスト によると、この方法は受け入れられた回答よりもわずかなマージンで優れています。さらに、パラメータnを提供して、受け入れ可能な文字のホワイトリストから任意のサイズのトークン長を生成します。それは柔軟性があり、うまく機能します。

function generateToken(n) {
    var chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    var token = '';
    for(var i = 0; i < n; i++) {
        token += chars[Math.floor(Math.random() * chars.length)];
    }
    return token;
}
3
ThisClark

非常にまれですが、Math.random()は0.0を返す可能性があります。その場合、 pimvdb のソリューションは""(空の文字列)を返します。したがって、ここに別の解決策があります。これは、すべての場合に10文字の長さのランダムなbase36を返します。

function generateToken() {
    Math.floor(1000000000000000 + Math.random() * 9000000000000000)
          .toString(36).substr(0, 10)
}
2
shaack
//length: defines the length of characters to express in the string

const Rand=()=>Math.random(0).toString(36).substr(2);
const token=(length)=>(Rand()+Rand()+Rand()+Rand()).substr(0,length);

console.log(token(40));
//example1:  token(10) => result: tsywlmdqu6
//example2:  token(40) => result: m4vni14mtln2547gy54ksclhcv0dj6tp9fhs1k10
2
Jasp402