2010-10-12 17:13:18

MurmurHash2A for PHP

テーマ:プログラミングとか
PHPでmurmurhashの習作。
未テスト(ぉ。我ながらOverflow-Phobiaな気がする。

2010/10/18 : strlenをCountにしてたのを修正。4バイトから、はみ出した部分のidxを間違えていたのを修正。

class CMurmurHash2A {
const _m = 0x5bd1e995;
const _r = 24;
const _s = 0xff;

private function UMul32($n, $m) {
$nh = (($n & 0xff000000) >> 24) & 0xff;
$nm = ($n & 0x00fff000) >> 12;
$nl = $n & 0x00000fff;
$mh = (($m & 0xff000000) >> 24) & 0xff;
$mm = ($m & 0x00fff000) >> 12;
$ml = $m & 0x00000fff;

$rl = $nl * $ml;
$rm = $nm * $ml + $nl * $mm + ($rl >> 12);
$rl &= 0x0fff;

$rh = $nl * $mh + $nh * $ml + $nm * $mm + ($rm >> 12);
$rm &= 0x0fff;

$rh &= 0xff;

$result = ($rh << 24) | ($rm << 12) | $rl;

return $result;
}

public static function Hash($inData, $inSeed = 0) {
if (is_null($inData)) $inData = '';
if (!is_string($inData)) {
$inData = pack('C*', $inData);
}

$inSeed = is_int($inSeed) ? $inSeed : 0;

$len = strlen($inData);
$l = $len;
$result = $inSeed;

$idx = 0;
while ($len >= 4) {
$k = (ord($inData[$idx++]))
| (ord($inData[$idx++]) << 8)
| (ord($inData[$idx++]) << 16)
| (ord($inData[$idx++]) << 24);

$k = self::UMul32($k, self::_m);
$k ^= ($k >> self::_r) & self::_s;
$k = self::UMul32($k, self::_m);
$result = self::UMul32($result, self::_m);
$result ^= $k;

$len -= 4;
}

$t = 0;
switch ($len) {
case 3:
$t ^= ord($inData[$idx+2]) << 16;
case 2:
$t ^= ord($inData[$idx+1]) << 8;
case 1:
$t ^= ord($inData[$idx]);
}

$t = self::UMul32($t, self::_m);
$t ^= ($t >> self::_r) & self::_s;
$t = self::UMul32($t, self::_m);
$result = self::UMul32($result, self::_m);
$result ^= $t;

$l = self::UMul32($l, self::_m);
$l ^= ($l >> self::_r) & self::_s;
$l = self::UMul32($l, self::_m);
$result = self::UMul32($result, self::_m);
$result ^= $l;

$result ^= ($result >> 13) & 0x7ffff;
$result = self::UMul32($result, self::_m);
$result ^= ($result >> 15) & 0x1ffff;

return $result;
}
}

$mh = CMurmurHash2A::Hash('test', 123);
echo sprintf('%u\n', $mh); //3350569634
$mh = CMurmurHash2A::Hash('test2', 123);
echo sprintf('%u\n', $mh); //2604824795
$mh = CMurmurHash2A::Hash('test123', 123);
echo sprintf('%u\n', $mh); //194661861
いいね!した人  |  コメント(0)  |  リブログ(0)
最近の画像つき記事
 もっと見る >>
2010-04-14 22:34:44

BitNamiのRedmineなぞ

テーマ:プログラミングとか
Redmineのオールイン1なソリューションの導入めも

http://bitnami.org/stack/redmine
ここからVMWare用のイメージを落とす。
zypperがすきならOpenSUSE、aptitudeが好きならUbuntu
ESXiにコンバータで転送。
ディスクイメージはだいたい20Gbぐらいになる。
以下はubuntu-way

そのままだとDHCPなので、固定IPを設定するのは面倒なので、DHCPサーバ(うちの場合はルーター)に
MACアドレスを設定する。

そのままのイメージだと、lessとかlocateもなくて困るので、そのたびにsudo aptitude install。
(あ、rootでアクセス不可なので、毎回sudo)

なお、sshdも標準では動いてないので、仮想マシンのコンソールで起動しておく。

Redmineでメール(gmail経由)を送るのは
/opt/bitnami/apps/redmine/config/email.ymlを作成

http://bitnami.org/forums/forums/redmine/topics/how-to-make-redmine-bitnami-send-email-with-gmail?page=1
を参考に
production:
delivery_method: :smtp
smtp_settings:
enable_starttls_auto: true
address: smtp.gmail.com
port: 587
domain: gmail.com
authentication: :login
user_name: もけけ
password: うへへ

sudo /opt/bitnami/ctlscript.sh status
で各サービス?の起動状態をチェック
bitnami@linux:~$ sudo /opt/bitnami/ctlscript.sh status
[sudo] password for bitnami:
subversion already running
apache already running
redmine already running
mysql already running

ここでRedmineが動いてなければ
sudo /opt/bitnami/ctlscript.sh start redmine

monogelのpidは
/opt/bitnami/apps/redmine/tmp/pids
ここにある。

OpenSUSEは俺が不慣れなのでrepoがあるところを見つけるのに時間がかかったり。
いいね!した人  |  コメント(0)  |  リブログ(0)
2009-11-02 02:21:49

久々のルンゲ・クッタ・ギル

テーマ:プログラミングとか
パラメータの算出方法なんて忘れてしまったわ

procedure RKGIntegration(var aX: Double; var aDx: Double; var aQ: Double; const aH: Double; const aMode: Integer);
const
c1 = 0.29289321881345247559915563789515; // 1-1/sqrt(2)
c2 = 1.7071067811865475244008443621048; // 1+1/sqrt(2)
kt1: array[0..3] of Double = ( 0.5, c1, c2, 0.5 );
kt2: array[0..3] of Double = ( 1.0, 1.0, 1.0, 1.0/3.0 );
qt: array[0..3] of Double = (-1.0, -c1, -c2, -1.0/3.0 );
var
t: Double;
k: Double;
begin
t := aX;

k := (aDx * aH) * kt1[aMode];

aX := t + k * kt2[aMode] + aQ * qt[aMode];
aQ := aQ + (aX - t) * 3.0 - k;
end;

ルンゲ・クッタ・ギルで微分方程式を解いたり

こんなのでテスト
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
m: Integer;
x, dx, qx: Double;
y, dy, qy: Double;
h: Double;
t: Double;
begin
Memo1.Lines.Clear;

x := 0.0;
dx := 0.0;
qx := 0.0;

y := 100.0;
dy := 0.0;
qy := 0.0;


h := 1/60;
t := 0;
while t < 6.28*2 do begin
Memo1.Lines.Add(Format('%f, %g, %g, %g', [t, x, y, x - Sin(t) * 100.0]));


for m := 0 to 3 do begin
dx := y;
dy := -x;
RKGIntegration(x, dx, qx, h, m);
RKGIntegration(y, dy, qy, h, m);

if (m = 1) or (m = 3) then begin
t := t + h * 0.5;
end;
end;
end;
end;
いいね!した人  |  コメント(0)  |  リブログ(0)

AD







ブログをはじめる

たくさんの芸能人・有名人が
書いているAmebaブログを
無料で簡単にはじめることができます。

公式トップブロガーへ応募

多くの方にご紹介したいブログを
執筆する方を「公式トップブロガー」
として認定しております。

芸能人・有名人ブログを開設

Amebaブログでは、芸能人・有名人ブログを
ご希望される著名人の方/事務所様を
随時募集しております。