12

私は次のようなニーモニック」パスワード生成関数を持っています:

function Mnemonic($mnemonic)
{
    $result = null;
    $charset = array(str_split('aeiou', 1), str_split('bcdfghjklmnpqrstvwxyz', 1));

    for ($i = 1; $i <= $mnemonic; $i++)
    {
        $result .= $charset[$i % 2][array_rand($charset[$i % 2])];
    }

    return $result;
}

基本的に、これ$mnemonicはすべての奇数文字が子音であり、すべての偶数文字が母音である長さの文字列を生成します。これによりパスワードの複雑さが軽減されることは理解していますが、通常は覚えるのがはるかに簡単です。今度は、入力しやすい文字列を生成して改善したいと思います。

QWERTYキーボードレイアウト

たとえば、* nixの初心者は、DebianよりもRHELベースのディストリビューションを常に好みますが、主な理由は、入力yumのしやすさよりも入力のしやすさですapt[-get]。自分で試してみてください。

QWERTYキーボードで簡単に入力できる文字列を生成するロジックをどのように実装する必要がありますか?

4

8 に答える 8

3

Carpalxは、タイピングの労力の計算について多くの研究を行っています。

  • 指の移動距離
  • 手、指、列のペナルティ
  • ストロークパス

彼らの研究の結果は、Dvorakよりも優れていると主張するColemakキーボードレイアウトです。

しかし、それはあなたが望むものから逆に書かれています-彼らの目標は入力に基づいてより良いキーボードレイアウトを見つけることですが、あなたはキーボードレイアウトに基づいて簡単な入力を見つけようとしています。

つまり、直接使用できない場合でも、興味深いと思うかもしれません(Perl-fuが強力な場合は、GPLであるため、アルゴリズムを抽出して逆にすることができるかもしれません)。

于 2010-02-09T19:36:46.570 に答える
2

指輪と小指(q、w、x、z、p)で入力されたすべての文字を削除してから、左手と右手で入力された文字を吐き出し、これらの文字を交互に使用することができます。

于 2010-02-05T17:44:57.697 に答える
1

おそらく、ヒューリスティックを使用して「入力のしやすさ」を測定できます。

たとえば、次のキャラクターに移動するときに指を動かすコストを考えてみましょう。これは、指がどれだけ移動する必要があるか、どの方向に移動する必要があるかなどの関数である可能性があります。

指や手を切り替える必要がある場合は、追加のコストを追加することもできます。

コストを少し試してみると、おそらく満足のいく解決策にたどり着くでしょう。

お役に立てば幸いです。

于 2010-02-05T17:40:28.033 に答える
1

すばらしい質問-上記の提案を参考にして、キーiからキーjまでの距離の式を次に示します。

重量=距離*a+スイッチ*b+同じ*c+シフト*d+奇妙な*e+開始*f

距離は値であり、その他は0/1の値です。

距離-QWERTYキーボードに細かいグリッドを重ね合わせて取得し、x、yを検索して、距離を計算します。距離には正の重みがあります。文字の組み合わせが異なる手を使用している場合(たとえば、aj、sk、wu ...)、距離はゼロです。

スイッチ-負の重み; 切り替えは良いです

同じ-aq、qa、az、zaは同じ指を使用します。同じことがポジティブです

シフト-シフトのあるものはすべてポジティブで本当に悪い

奇妙な-私はあなたがキーボードを見なければならないので$または〜が悪いことを知らない。

開始-asdfjklの開始または終了。あなたの指が休んでいるので、おそらくネガティブで良いです。

係数-相対値が妥当であると思われる限り、開始するだけです。本当に派手になりたい場合は、誰かに数十セットの数字を入力してもらい、ストップウォッチを使用して回帰モデルを適合させます。

実装-6文字のパスワードがあるとします。

ここで、各文字で始まる6文字の最小値が必要です。列内のN個のキーの配列を想像してみてください。ここで、6つの列を想像してください。最短パスワードは、6つの列を通る最短パスです(サイクルが許可されています)。サイクルを排除するためにいくつかのロジックを追加する必要があるかもしれませんが、これは良い最初のパスであるはずです。(私はここで怠惰になっています-おそらくこの問題を処理するグラフ理論の定式化があります。)

私は誰かが以前にこれをしたに違いない-特にキーストロークの部分。

于 2010-02-05T20:28:19.177 に答える
1

Dvorakキーボードで使用されている原則を確認することをお勧めします。

パスワード生成アルゴリズムに適用されるこれらの原則は次のとおりです。

  • 文字は手を変えて入力する必要があります。
  • 入力しやすい組み合わせを使用します。Dvorakレイアウトを見て、一般的な有向グラフとその文字の位置を確認してください。
  • 下の行から1文字だけを使用するかどうか。ランダムに!
  • 2対1の比率にすることができます(右手で入力した2文字と左手で入力した1文字)。
  • 比率は2対1なので、同じ手で2つの連続した文字を入力することになります。したがって、キーボードの外側から内側に向​​かって入力する必要があります。この原則は有向グラフに適用されます。

QWERTYキーボードだとおっしゃっていましたが、QWERTYキーボードでこれらの原則を使用すると、次のような非常に良い結果が得られます。

ktrd、ogkdo(dvorakの「タイプライター」)

kjg; g; akd; k(ホーム行のみを使用)

pjedoildupsk(原則に従ったランダムなパスワード)

すべてのドヴォルザークは嫌いです、それを黙らせてください!

これがお役に立てば幸いです。

于 2010-02-13T16:20:05.700 に答える
1

私は以下を一緒に粉砕しました。それはハックの仕事ですが、かなりうまくいくようです。

<?
function Mnemonic($mnemonic)
{
    $result = null;
    $charset = array(str_split('@a3e!1i0ou', 1), str_split('#$*bcdfghjklmnpqrstvwxyz', 1));

    $lastchar = ' ';
    for ($i = 1; $i <= $mnemonic; $i++)
    {
      do {
        $char = $charset[$i % 2][array_rand($charset[$i % 2])];
      } while (!nextkey($lastchar, $char));
      $result .= $char;
    }

    return $result;
}

function nextkey($lastchar, $requestchar)
{
  $map = array();
  $map[] = '!qaz'; // ll
  $map[] = @#wsx1'; // lr
  $map[] = 'ed23'; // lm
  $map[] = '$%^rtfgcvb456'; // li
  $map[] = '&yhnujm7'; // ri
  $map[] = '*()ik89'; // rm
  $map[] = 'olp,.'; // rr
  $map[] = ';[]'; // rl
  $map[] = '!@#$%^&*()[]'; // special chars, don't follow
  $map[] = 'pbvcnmq'; // consonant clusters, don't follwo

  if($lastchar == $requestchar) return true;
  foreach($map as $string)
    if(strpos($string, $requestchar) && strpos($string, $lastchar)) return false;
  return true;
}

printf("%s\n", Mnemonic(8));
?>

于 2014-10-02T21:06:35.850 に答える
0

キーボードを表し、各文字の入力に使用される行、列、手、および指をコード化するデータ構造を構築します。開発した柔軟なルールに基づいて、文字が表示されたときに「次に入力しやすい」文字のリストを提供する関数を記述します。キー間の距離を計算する別の関数に依存する可能性があります。

個人的には、同じ手で2回文字を入力するのが遅いとは思いません。前の文字が近すぎる指を使用した場合にのみ、困難になります。たとえば、XQは、入力に必要な隣接する指を処理するために手が上に移動する必要があるため、入力が困難です。しかし、人差し指がまだBに取り組んでいる間、小指がQに向かう可能性があるため、BQを入力するのはまったく難しいとは思いません。

また、薬指が長く、ピンキーがAにある間、ほぼ静止した位置でWに自然にフィットするため、QSよりもAWを入力する方がはるかに簡単です。一方、QSは、ピンキーのストレッチと同時の薬指の相反する筋肉のクランチ。

お互いの文字に対して各文字のマップを作成し始めると、すぐに簡単さや難しさのさまざまな側面を表すための合理的な方法が見つかります。私のXQ/BQの例を一般化すると、1行の変更には2本以上の指の距離が必要であり、2行の変更には3本の指の距離が必要であり、3行の変更(おそらく数字)には交互の手が必要です。

また、WDとILの間の距離がSEとKOよりもわずかに長いと、キーの配置がわずかにギザギザになるため、難易度が変わることにも気づいています。

いくつかの分析(Excelを使用してタイピングの難しさを「マップアウト」することをお勧めします)を使用すると、入力しやすい単語を作成するのに役立つアルゴリズムを思い付くことができると確信しています。

可能であれば、少なくとも1つの数字を入れてみてください。また、スペースの使用も検討してください。

于 2010-02-05T18:02:31.467 に答える
0

これを実装する場合は、ある文字から別の文字に移動するための「コスト」を決定するときに、ユーザーのロケールを考慮に入れてください。ユーザーが別のキーボードレイアウトを使用している場合、入力しやすいパスワードはかなり面倒になる可能性があります。ある言語のキーボードで簡単にアクセスできる一部のキーは、追加の修飾キー(Shift、Metaなど)を必要とせずに別の言語のキーボードで使用できない場合があります。

この考えを普遍的に保つために、どの文字がどのキーに属しているかを無視し、代わりにキーを行と列の配列として扱うことをお勧めします。各行は通常、前の行からキー幅の約1/3だけオフセットされています。これを念頭に置いて、任意の2つのキー間の距離を計算するのは難しいことではありません。

# Key at top left corner is {0, 0}
key1 @ {x1, y1}
key2 @ {x2, y2}

xdistance = absolute_value(x2 - x1)
ydistance = absolute_value(y2 - y1)

if y1 > y2
  xdistance += (1/3 * ydistance)
else
  xdistance -= (1/3 * ydistance)

total_distance = square_root(xdistance^2 + ydistance^2)

長さと「入力のしやすさ」の要件を満たす一連のキー位置を生成してから、ユーザーの現在のキーマップを使用して、これらのインデックスを文字に再マップします。

于 2010-02-08T17:44:12.183 に答える