2010-10-07 42 views

Trả lời

6

Lượng thông tin mà số nguyên PHP có thể lưu trữ bị giới hạn. Số lượng thông tin bạn có thể lưu trữ trong chuỗi không phải là (ít nhất là nếu chuỗi không dài một cách không hợp lý.)

Vì vậy, bạn cần phải nén chuỗi có độ dài tùy ý của mình thành số nguyên không dài tùy ý. Đây là không thể mà không bị mất dữ liệu.

Bạn có thể sử dụng thuật toán băm, nhưng thuật toán băm có thể luôn có xung đột. Đặc biệt nếu bạn muốn băm một chuỗi thành một số nguyên thì xác suất va chạm là khá cao - các số nguyên chỉ có thể lưu trữ rất ít dữ liệu.

Vì vậy, bạn phải gắn bó với email hoặc sử dụng trường số nguyên tăng dần tự động.

+0

bạn có thể giải thích câu trả lời của bạn tốt hơn, đặc biệt là đoạn cuối và cảm ơn bạn – jspeshu

+0

lý do tốt tôi phải nói, nhưng tôi có thể tìm ít nhất một hàm sẽ làm điều này, ví dụ: tôi có một email tức là trường VARCHAR (40), vì trường này là duy nhất cho tất cả các giá trị hơn là sử dụng hàm băm để tránh thông đồng, tôi sẽ thêm một số giá trị nói XXXX sao cho chiều dài == 40 vẫn là duy nhất, sau đó làm thế nào tôi có thể có một int duy nhất trong số này – jspeshu

+2

Vâng. Tôi vẫn không nghĩ rằng bạn sẽ tìm thấy một chức năng như vậy: Một chuỗi 40 ký tự có thể được lưu trữ trong 40 byte (nếu nó là ascii, unicode sẽ mất * thậm chí nhiều hơn *). Mặt khác, một số nguyên chỉ có 8 byte (và chỉ trên một máy 64 bit). Vì vậy, bạn vẫn sẽ cần lưu trữ 40 byte trong 8 byte ... – NikiC

4

Thử binhex chức năng

từ các trang web trên:

<?php 
$str = "Hello world!"; 
echo bin2hex($str) . "<br />"; 
echo pack("H*",bin2hex($str)) . "<br />"; 
?> 

đầu ra

48656c6c6f20776f726c6421 
Hello world! 
+0

nó có thể tạo ra một int độc đáo tại là nhìn thấy nó "48656c6c6f20776f726c6421" một hex hoặc lâu hơn – jspeshu

+0

phụ thuộc lớn như thế nào int là mặc dù - có một giá trị int 5216694956355254127 –

2

Tại sao không chỉ có một trường ID auto-increment trên cơ sở dữ liệu?

+0

tôi không có db i đang đọc dữ liệu từ máy chủ ldap và trường duy nhất duy nhất là địa chỉ email của họ – jspeshu

+2

+1 đó là cách tiếp cận chính xác. không có ma thuật chuỗi. – NikiC

+0

Bạn không thực sự cần một DB cho phương pháp này, tôi đoán bạn có thể có một gia tăng tập tin văn bản cho mỗi thể loại tăng dần tên tập tin. – Vass

0

Nếu email là văn bản ascii, bạn có thể sử dụng PHP ord function để tạo số nguyên duy nhất, nhưng nó sẽ là một số rất lớn!

Cách tiếp cận sẽ là làm việc thông qua địa chỉ email một ký tự cùng một lúc, gọi thứ tự cho mỗi người trong số họ. Hàm thứ tự trả về một số nguyên biểu thị giá trị của ký tự. Bạn có thể đánh dấu từng số này bằng số không và sau đó sử dụng chuỗi nối để ghép chúng vào nhau.

Cân nhắc "abc".

ord("a"); 
>> 97 

ord("b"); 
>> 98 

ord("c"); 
>> 99 

Pad các số này bằng 0 và bạn có số duy nhất cho số đó là: 970980990.

Tôi hy vọng điều đó sẽ hữu ích!

+0

làm thế nào về giới hạn độ dài ví dụ làm thế nào về email này "[email protected]" là có một int tương đương cho điều này tôi không nghĩ như vậy b/se php có một số liên tục gọi là PHP_MAX_INT hoặc một cái gì đó như thế – jspeshu

+0

Vâng, đó sẽ là vấn đề cần khắc phục. Như mọi người đang nói, đây không phải là cách đúng để làm điều này - tôi chỉ muốn nêu bật một cách tiếp cận trong trường hợp giúp. – adamnfish

-1

Tại sao không tạo bảng liên kết của riêng bạn cục bộ sẽ liên kết các email với các số nguyên duy nhất?

Vì vậy, các luồng công việc sẽ được trong dòng:

1 get the record from the ldap server. 
2 check it locally if it has already an int assigned. 
2.1 if yes use that int. 
2.2 if no, generate an associative row in the table locally. 
3 do your things with the unique ids. 

Việc đó có ý nghĩa?

+0

xin lỗi nhưng đã không nhận được rằng ... – jspeshu

+0

Cách duy nhất bạn có thể duy trì một liên kết giữa các email của bạn và một danh sách các số nguyên là bởi có một lớp liên tục (một cơ sở dữ liệu ví dụ) sẽ hoạt động như một người lập bản đồ giữa các email của bạn và những con số. Vì vậy, tạo bảng cơ sở dữ liệu hoặc tệp cục bộ của bạn và lưu trữ dữ liệu như vậy: [email protected] = 1001, [email protected] = 1002, v.v. – Slavic

+0

đó là những gì tôi muốn tránh và điều gì dẫn tôi đến Câu hỏi này? nhưng cảm ơn bạn tôi nghĩ rằng anh chàng này @nikic có nó – jspeshu

-1

Bạn có thể sử dụng chức năng này:

function stringToInteger($string) { 
    $output = ''; 
    for ($i = 0; $i < strlen($string); $i++) { 
     $output .= (string) ord($string[$i]); 
    } 
    return (int) $output; 
} 

Một chút xấu xí, nhưng hoạt động :)

+1

bạn có thể muốn chuyển đổi tất cả địa chỉ email thành chữ thường đầu tiên, để bạn luôn nhận được giá trị chuỗi nhất quán (strtolower) – Hightower

+0

đoạn (int) không đúng, vì nó sẽ luôn trả về giá trị int tối đa cho chuỗi dài – Rajesh

1

Mã này tạo ra số 64bit có thể được sử dụng vì nó hoặc là một bigint/tương tự dữ liệu kiểu cho cơ sở dữ liệu như MySQL, v.v.

function get64BitNumber($str) 
{ 
    return gmp_strval(gmp_init(substr(md5($str), 0, 16), 16), 10); 
} 

echo get64BitNumber('Hello World!'); // 17079728445181560374 
echo get64BitNumber('Hello World#'); // 2208921763183434891 
echo get64BitNumber('http://waqaralamgir.tk/'); // 12007604953204508983 
echo get64BitNumber('12345678910'); // 4841164765122470932 
Các vấn đề liên quan