Có a bug in Firefox (ngay cả trong bản beta mới và trong bản phát hành mỏ) ngăn chặn bộ nhớ đệm của một số tệp nhất định vì thuật toán tạo khóa trong băm bộ nhớ cache của chúng. Here is a link to the source code of the function.Thuật toán tạo khóa băm trong bộ nhớ cache của firefox
Tôi muốn đảm bảo rằng tất cả các tệp trên trang web của tôi có thể được lưu vào bộ nhớ cache. Tuy nhiên, tôi không hiểu tại sao hàm băm của họ không tạo được khóa duy nhất cho các url riêng biệt. Tôi hy vọng ai đó có thể mô tả hàm này mal trong mã psuedo hoặc java.
Sẽ rất hữu ích khi tạo tiện ích cho nhà phát triển để đảm bảo url duy nhất cho đến khi lỗi này được khắc phục.
EDIT: Đã có một số câu trả lời rất hữu ích, tuy nhiên, tôi cần thêm bước-by-step giúp đỡ để tạo ra một tiện ích để kiểm tra những mixups cache. Nó sẽ là tuyệt vời để có được một số mã java mà có thể sao chép các phím mà firefox đang tạo ra. Do đó, việc mở một tiền thưởng cho câu hỏi này.
EDIT 2: Đây là một cổng java làm việc một phần (viết bằng processing). Lưu ý các bài kiểm tra ở phía dưới; ba công việc đầu tiên như mong đợi, nhưng những người khác thì không. Tôi nghi ngờ một cái gì đó liên quan đến ints ký/unsigned. Gợi ý?
//
// the bad collision function
// http://mxr.mozilla.org/mozilla/source/netwerk/cache/src/nsDiskCacheDevice.cpp#240
//
//248 PLDHashNumber
//249 nsDiskCache::Hash(const char * key)
//250 {
//251 PLDHashNumber h = 0;
//252 for (const PRUint8* s = (PRUint8*) key; *s != '\0'; ++s)
//253 h = PR_ROTATE_LEFT32(h, 4)^*s;
//254 return (h == 0 ? ULONG_MAX : h);
//255 }
//
// a java port...
//
String getHash(String url)
{
//get the char array for the url string
char[] cs = getCharArray(url);
int h = 0;
//for (const PRUint8* s = (PRUint8*) key; *s != '\0'; ++s)
for (int i=0; i < cs.length; i++)
{ h = PR_ROTATE_LEFT32(h, 4)^cs[i];
}
//looks like the examples above return something in hex.
//if we get matching ints, that is ok by me.
//but for fun, lets try to hex the return vals?
String hexVal = hex(h);
return hexVal;
}
char[] getCharArray(String s)
{
char[] cs = new char[s.length()];
for (int i=0; i<s.length(); i++)
{
char c = s.charAt(i);
cs[i] = c;
}
return cs;
}
//
// how to PR_ROTATE_LEFT32
//
//110 /*
//111 ** Macros for rotate left and right. The argument 'a' must be an unsigned
//112 ** 32-bit integer type such as PRUint32.
//113 **
//114 ** There is no rotate operation in the C Language, so the construct
//115 ** (a << 4) | (a >> 28) is frequently used instead. Most compilers convert
//116 ** this to a rotate instruction, but MSVC doesn't without a little help.
//117 ** To get MSVC to generate a rotate instruction, we have to use the _rotl
//118 ** or _rotr intrinsic and use a pragma to make it inline.
//119 **
//120 ** Note: MSVC in VS2005 will do an inline rotate instruction on the above
//121 ** construct.
//122 */
//...
//128 #define PR_ROTATE_LEFT32(a, bits) _rotl(a, bits)
//return an int (32 bit). what do we do with the 'bits' parameter? ignore?
int PR_ROTATE_LEFT32(int a, int bits)
{ return (a << 4) | (a >> (32-bits));
}
//
// examples of some colliding hashes
// https://bugzilla.mozilla.org/show_bug.cgi?id=290032#c5
//
//$ ./hashit "ABA/xxx.aba"
//8ffac222
//$ ./hashit "XyZ/xxx.xYz"
//8ffac222
//$ ./hashit "CSS/xxx.css"
//8ffac222
//$ ./hashit "JPG/xxx.jpg"
//8ffac222
//$ ./hashit modules_newsfeeds/MenuBar/MenuBar.css
//15c23729
//$ ./hashit modules_newsfeeds/ListBar/ListBar.css
//15c23729
//$ ./hashit modules_newsfeeds/MenuBar/MenuBar.js
//a15c23e5
//$ ./hashit modules_newsfeeds/ListBar/ListBar.js
//a15c23e5
//
// our attempt at porting this algorithm to java...
//
void setup()
{
String a = "ABA/xxx.aba";
String b = "CSS/xxx.css";
String c = "CSS/xxx.css";
String d = "JPG/xxx.jpg";
println(getHash(a)); //yes 8ffac222
println(getHash(b)); //yes 8ffac222
println(getHash(c)); //yes 8ffac222
println(getHash(d)); //no [??] FFFFFF98, not 8ffac222
println("-----");
String e = "modules_newsfeeds/MenuBar/MenuBar.css";
String f = "modules_newsfeeds/ListBar/ListBar.css";
println(getHash(e)); //no [??] FFFFFF8C, not 15c23729
println(getHash(f)); //no [??] FFFFFF8C, not 15c23729
println("-----");
String g = "modules_newsfeeds/MenuBar/MenuBar.js";
String h = "modules_newsfeeds/ListBar/ListBar.js";
println(getHash(g)); //yes [??] FFFFFF8C, not a15c23e5
println(getHash(h)); //yes [??] FFFFFF8C, not a15c23e5
}
Thành thật mà nói, tôi đang lo lắng về điều này hoàn toàn quá nhiều. Bạn đang gặp phải một số vấn đề, hay đây là tất cả tối ưu hóa sớm? –
gặp sự cố. : -/ – jedierikb
giải thích thêm về sự cố: cần đưa ra các chiến lược để đảm bảo rằng hàng nghìn tệp được lưu trữ chính xác. ngay bây giờ, họ không. muốn xử lý trước tất cả các tên tệp để đảm bảo chúng có thể lưu vào bộ nhớ cache. – jedierikb