ベース62(A-Za-z0-9)に変換するスクリプトがありますが、MD5から数値を取得するにはどうすればよいですか?
私は多くの場所で、MD5からの数値がphpが整数として処理できるよりも大きいため、不正確になることを読みました...とにかく短いURLが必要で、ハッシュ全体を使用する予定はなかったので、おそらく8文字だけです。それの....
だから私の質問は、MD5ハッシュの数の一部を取得する方法ですか?
また、MD5ハッシュの一部のみを使用するのは悪い考えですか?
ここで別のことを提案します。md5ハッシュの10進チャンクのみを使用することに関心があるので、CRC32やAdlerなどの他の短い数値ハッシュを使用しないのはなぜですか。次に例を示します。
$hash = sprintf('%u', crc32('your string here'));
これにより、文字列の8桁のハッシュが生成されます。
編集:私はあなたを誤解したと思います、ここに62までのベースへのそしてベースからの変換を提供するいくつかの関数があります。
編集(再度):任意の長さの数値を操作するには、bc_mathまたはGMP拡張のいずれかを使用する必要があります。これは、bc_math拡張を使用し、2進数から62進数に変換できる関数です。次のように使用する必要があります。
echo bc_base_convert(md5('your url here'), 16, 62); // public base 62 hash
およびその逆:
echo bc_base_convert('base 62 encoded value here', 62, 16); // private md5 hash
それが役に立てば幸い。=)
可能であれば、URLにハッシュを使用しないことをお勧めします。最終的には衝突に遭遇します...特にハッシュを切り捨てている場合はそうです。先に進んで、各アイテムが一意のIDを持つIDベースのシステムを実装すると、頭痛の種がはるかに少なくなります。最初の項目は1
、2番目の項目は、などになります--- MySQLを使用している場合は、自動2
インクリメント列を挿入するだけです。
短いIDを作成するには:
//the basic example
$sid = base_convert($id, 10, 36);
//if you're going to be needing 64 bit numbers converted
//on a 32 bit machine, use this instead
$sid = gmp_strval(gmp_init($id, 10), 36);
短いIDを10進数のIDに戻すには:
//the basic example
$id = base_convert($id, 36, 10);
//if you're going to be needing 64 bit numbers
//on a 32 bit machine, use this instead
$id = gmp_strval(gmp_init($shortid, 36));
お役に立てれば!
本当にbase62が必要な場合(gmp
またはでは実行できませんbase_convert
)、これを確認してください:
http ://snipplr.com/view/22246/base62-encode--decode/
あなたはこのようにこれを行うことができます:(すべてのステップがphpにあるわけではありません、私がそれを使ったのは長い間です。)
次のようなスクリプトのmd5ハッシュを作成します。
$ hash = md5(script、raw_output = true);
その数を62進数に変換します。
PHPでの任意のサイズの数値の基本変換に関する質問を参照してください
文字列を好きな長さに切り捨てます。
md5のほんの数ビットを使用してもリスクはありません。変化するのは衝突の危険性だけです。
実際には、おそらく抽出できるJava実装があります。これは、Pulseと呼ばれるオープンソースのCMSソリューションです。
toBase62()
とのコードはこちらをご覧くださいfromBase62()
。
http://pulse.torweg.org/javadoc/src-html/org/torweg/pulse/util/StringUtils.java.html
の唯一の依存関係StringUtils
はLifeCycleクラスです。これは、文字列のソルトハッシュを取得する方法を提供します。このハッシュは、すべて一緒に省略したり、メソッドをコピーにコピーしたりすることもできますStringUtils
。Voilá。
あなたはこのようなことをすることができます、
$hash = md5("The data to be hashed", true);
$ints = unpack("L*num", $hash);
$hash_str = base62($ints['num1']) . base62($ints['num2']) . base62($ints['num3']) . base62($ints['num4'])
PHP 5.3.2の時点で、GMPは最大62のベース(以前は36のみ)をサポートしているため、brianreavisの提案は非常に近いものでした。したがって、あなたの質問に対する最も簡単な答えは次のとおりです。
function base62hash($source, $chars = 22) {
return substr(gmp_strval(gmp_init(md5($source), 16), 62), 0, $chars);
}
base-16からbase-62への変換には、明らかにスペース上の利点があります。通常の128ビットMD5ハッシュは16進数で32文字ですが、base-62では22文字です。データベースにハッシュを格納している場合は、それらをrawバイナリに変換して、さらに多くのスペースを節約できます(16バイトの場合MD5)。
結果のハッシュは単なる文字列表現であるため、(関数のように)少しだけ必要な場合は、substrを使用できます。
base62xを試して、安全で互換性のあるエンコードされた表現を取得できます。
base62xの詳細については、こちらをご覧-base62x
ください-NatureDNS
。
shell> ./base62x -n 16 -enc 16AF
1Ql
shell> ./base62x -n 16 -dec 1Ql
16AF
shell> ./base62x
Usage: ./base62x [-v] [-n <2|8|10|16|32>] <-enc|dec> string
Version: 0.60
これは、MD5文字列をBase62文字列に変換するオープンソースのJavaライブラリです https://github.com/inder123/base62
Md5ToBase62.toBase62("9e107d9d372bb6826bd81d3542a419d6") ==> cbIKGiMVkLFTeenAa5kgO4
Md5ToBase62.fromBase62("4KfZYA1udiGCjCEFC0l") ==> 0000bdd3bb56865852a632deadbc62fc
変換は双方向であるため、md5に戻すと、元のmd5が返されます。
Md5ToBase62.fromBase62(Md5ToBase62.toBase62("9e107d9d372bb6826bd81d3542a419d6")) ==> 9e107d9d372bb6826bd81d3542a419d6
Md5ToBase62.toBase62(Md5ToBase62.fromBase62("cbIKGiMVkLFTeenAa5kgO4")) . ==> cbIKGiMVkLFTeenAa5kgO4
`` `
-
and_
の代わりに+
andを使用して、わずかに変更されたBase64を使用できます/
。
function base64_url_encode($str) {
return strtr(base64_encode($str), array('+'=>'-', '/'=>'_'));
}
function base64_url_decode($str) {
return base64_decode(strtr($str, array('-'=>'+', '_'=>'/')));
}
=
さらに、末尾のパディング文字を削除することもできます。
そして、生のMD5値(バイナリ文字列)を取得するには、2番目のパラメータ($raw_output
マニュアルで指定されている)をtrueに設定します。
$raw_md5 = md5($str, true);