String
のハッシュを作成する最良の方法は、ハッシュが4文字を超えていない可能性があり、4文字が小文字または数字のみである場合です。一意のハッシュは最大4文字ですか?
ハッシュする文字列の長さは1〜255文字です。 私は衝突なしで4文字ハッシュとして作成することはおそらく不可能であることを知っています。しかし、可能な衝突が最小限に抑えられる良いハッシュがあれば十分でしょう。 http://introcs.cs.princeton.edu/java/61data/CRC16CCITT.java
public class CRC16CCITT {
public static void main(String[] args) {
int crc = 0xFFFF; // initial value
int polynomial = 0x1021; // 0001 0000 0010 0001 (0, 5, 12)
// byte[] testBytes = "123456789".getBytes("ASCII");
byte[] bytes = args[0].getBytes();
for (byte b : bytes) {
for (int i = 0; i < 8; i++) {
boolean bit = ((b >> (7-i) & 1) == 1);
boolean c15 = ((crc >> 15 & 1) == 1);
crc <<= 1;
if (c15^bit) crc ^= polynomial;
}
}
crc &= 0xffff;
StdOut.println("CRC16-CCITT = " + Integer.toHexString(crc));
}
}
しかし、これはあまりにも多くの衝突を与える:私が試した何
はこちらからCRC16CCITT
です。より良いアルゴリズムはありますか?
小文字と数字は、36^4種類のハッシュしかないことを意味します。したがって、一様分布のハッシュを生成するハッシュ関数を使用しても、〜sqrt(36^4)= 1296値(誕生日パラドックスによる)。ハッシュスペースにはもっと多くの値が必要です。 –
これを見て参考になるかもしれません:http://stackoverflow.com/questions/12076846/using-a-larger-prime-as-a-multiplier-when-overrid-hashcode – posdef
@AndyTurner明確化のためにありがとう。とにかく私は4文字に制限されているので、私は設計によって非ユニークなハッシュを持つだろうと知っています。しかし、私は最高の "衝突の可能性が低い"ハッシュを与えるアルゴリズムを探しています。 – membersound