Điểm:1

Có thể có một hàm nội suy ánh xạ một tập hợp số nguyên lớn thành một tập hợp nhỏ hơn trong khi "nhận biết va chạm" không

lá cờ in

Xét hai tập hợp:

"Tập hợp lớn" chứa tất cả các số nguyên giữa $0$$2^{160}$ chính xác một lần.

"Tập hợp nhỏ" chứa tất cả các số nguyên giữa $0$$2^{32}$ chính xác một lần.

Cho rằng số lượng phần tử trong "tập hợp lớn" nhiều hơn số phần tử trong "tập hợp nhỏ", không thể tồn tại hàm nội xạ $f(n_b) = n_s$ ánh xạ bất kỳ đầu vào nào là thành viên của "tập hợp lớn" $n_b$ đến đầu ra là thành viên của "tập hợp nhỏ" $n_s$. Nếu chức năng đó $f$ tồn tại, nó sẽ là câu trả lời của câu hỏi.

Vì những lý do thực tế, chúng tôi giả định rằng vẫn có thể có một cấu trúc/thuật toán có chức năng thực tế $f_p$ trong đó kết quả của tất cả các đầu vào vào $f_p(n_b)$ là một thành viên của "tập hợp nhỏ" và mỗi $n_b$ chỉ ra một sự khác biệt $n_s$.

Đối với sự thiếu hiểu biết về các khái niệm mật mã, tôi sẽ gọi thuộc tính này là "nhận biết va chạm". Ví dụ. để thực hiện việc xây dựng này, giả sử dung lượng lưu trữ có kích thước bằng $2^{256}$ (số nguyên không dấu 256 bit), có chức năng nào không $f_p$ hoặc một thuật toán cho bất kỳ $n_b$ hoặc trả về một "va chạm" ("nhận biết va chạm") hoặc một thành viên riêng biệt của $n_s$?

lá cờ cn
Rất không rõ ràng với tôi những gì bạn đang tìm kiếm. Làm thế nào để những gì bạn đang mô tả trong đoạn thứ hai của bạn khác với một chức năng tiêm?
lá cờ cn
"Trở lại một vụ va chạm" nghĩa là gì?
user10030 avatar
lá cờ in
Tôi đang tìm một hàm trong đó thẻ(miền) > thẻ(tên miền) nhưng mỗi số mà tôi lấy làm đầu vào cho hàm từ ánh xạ miền sang một số riêng biệt trong tên miền chung. Theo hiểu biết của tôi, điều này chỉ có thể thực hiện được nếu thẻ (tên miền) >= thẻ (tên miền). Vì vậy, vì điều này là không thể, tôi có thể có chức năng cho phép loại ánh xạ này không, ví dụ: "lỗi" nếu lần đầu tiên phát hiện va chạm.
lá cờ cn
Điều đó là không thể, vâng. Nhưng chính xác hành vi bạn muốn là gì? Hàm trả về giá trị từ miền hoặc ký hiệu lỗi?
user10030 avatar
lá cờ in
Đây là những gì tôi thực sự muốn: Thỉnh thoảng tôi nhận được một số ngẫu nhiên trong số uint160 (đó là tài khoản/địa chỉ Ethereum) và tôi cần một chức năng ánh xạ rõ ràng từng địa chỉ tới một vị trí cụ thể của danh sách có độ dài 2^32.Giả sử tôi đã phân bổ 100 địa chỉ, bây giờ địa chỉ #101 đã xuất hiện lâu và vị trí của nó giống như ví dụ: #91, sau đó tôi muốn biết rằng có xung đột đối với các vị trí hiện tại #101 không nên ghi đè lên #91. Tuy nhiên, tôi không thể chỉ lưu trữ tất cả các địa chỉ đã lưu trữ trước đó. Tôi chỉ có một khe dung lượng lưu trữ theo kích thước, ví dụ: uin256.
lá cờ cn
Không có bất kỳ yêu cầu bổ sung nào, hàm được xác định là "Nếu $x\leq2^{32}$, trả về $x$, nếu không thì trả về $\bot$." dường như đáp ứng yêu cầu của bạn từ câu hỏi. Nhưng tôi chắc chắn rằng bạn có các yêu cầu bổ sung mà vì lý do nào đó bạn từ chối chỉ định.
user10030 avatar
lá cờ in
Không phải là từ chối. Đúng hơn là không thể thể hiện bản thân đúng cách. Tôi sẽ cố gắng chỉ định thêm. Cảm ơn đã giúp đỡ cho đến nay. Để tiếp tục: Nếu chúng ta sử dụng "if $x
fgrieu avatar
lá cờ ng
Điều gì về một băm cắt ngắn? Trong trường hợp sử dụng của chúng tôi, điều đó hoạt động đến và bao gồm #101 với ít hơn 1 cơ hội trong 850 nghìn cơ hội ngược lại.
lá cờ cn
Nỗ lực rõ ràng là sai lầm tiếp theo để tìm ra những gì bạn thực sự đang tìm kiếm: Gán các chỉ số theo tuần tự. Duy trì bộ đếm 33 bit n được khởi tạo ở mức 0. Mỗi khi bạn nhìn thấy một đầu vào, nếu $n
user10030 avatar
lá cờ in
@fgrieu Thật thú vị. Điều tôi thích ở điều này là nó lấp đầy không gian tên miền 2^32 dần dần và trải đều. Tuy nhiên, vấn đề tôi thấy là do hàm băm được cung cấp: Tôi muốn lưu trữ số dư Ether liên quan đến nó. Ví dụ. Tôi muốn nói rằng $n_b$ e.g. 0xabc... â $n_s$ sở hữu 1 Ether. Tuy nhiên, khi số dư trở nên lớn hơn, tại một thời điểm - tương tự như cách khai thác Bitcoin - việc chạy thuật toán brute force có thể trở nên hợp lý về mặt kinh tế, ví dụ: tìm xung đột cho $n_s$ cho tài khoản $n_b$ hiện có số dư lớn.
user10030 avatar
lá cờ in
Xin chào @Maeher. Đưa ra một bộ đếm tăng với mỗi đầu vào và có dung lượng lớn hơn 1 bit so với số MAX trong tên miền, vấn đề là đối với bất kỳ số nào trong miền, tôi muốn gán cho nó chính xác một số trong tên miền ngay cả khi lặp lại các lần chèn. Tôi làm việc trong lĩnh vực khoa học máy tính nên tôi gọi một chức năng như vậy là "xác định". Với một đầu vào cụ thể, nó luôn tạo ra cùng một đầu ra. Theo những gì tôi hiểu là nếu chúng tôi sử dụng bộ đếm tăng dần, nếu chúng tôi liên tục chèn cùng một đầu vào nhiều lần, thì mỗi lần chúng tôi sẽ nhận được các kết quả tên miền khác nhau (ví dụ: tăng thêm 1).
lá cờ cn
Bạn có thể thử sử dụng hàm băm bị cắt ngắn và duy trì cơ sở hạ tầng thành viên được thiết lập gần đúng (ví dụ: bộ lọc Bloom) của các chỉ số đã sử dụng hết. Nhưng có khả năng rằng điều đó sẽ kết thúc quá lớn.
Điểm:2
lá cờ cn

Thế còn:- $$ n_s = \mathcal{H}(n_b) \& (2^{32} - 1) $$ ở đâu $n_b \in N_b$, vân vân? $\mathcal{H}$ có thể là một hàm băm do bạn chọn. Vì đây là một trang web về tiền điện tử nên tôi đề xuất SHA-256. $\&$ có nghĩa là bit AND, nhưng có thể được thay thế bằng dịch chuyển phải hoặc trái của số bit thích hợp (128 trong trường hợp của SHA-256). Có lẽ quá chậm (?)

Hàm băm mật mã là surjective, nghĩa là đầu ra của chúng thỉnh thoảng xung đột. Tỷ lệ va chạm đó sẽ tăng lên rất nhiều nếu bạn cắt bớt $\mathcal{H}$ đến 32 bit. Thậm chí nhiều hơn như vậy sẽ ảnh hưởng của nguyên tắc lỗ chim bồ câu. Vì vậy, bạn sẽ có thiết lập $N_b$ lấp đầy với các số được phân phối đồng đều, cho $n_b \đến n_s$ từ miền này sang tên miền khác.


Tôi không biết về Ethereum, nhưng 160 trông giống như đầu ra của SHA-1 một cách đáng ngờ. Nếu vậy, chỉ cần cắt ngắn tài khoản/địa chỉ thành 32 bit vì nó đã được phân phối đồng đều.

lá cờ ma
"Hàm băm mật mã là độc quyền" - Tôi không nghĩ vậy. Tính phỏng đoán có nghĩa là đối với mọi giá trị băm có thể có, tồn tại một số thông báo tạo ra nó. Bạn không thể chứng minh rằng hàm băm mật mã không có "điểm mù".
user10030 avatar
lá cờ in
Chào @paul-uszak. Tôi đã nhận xét trong câu trả lời ban đầu của mình tại sao tôi tin rằng việc cắt ngắn không phải là giải pháp tối ưu. Viết cho uint160 và SHA-1: Trong Ethereum, một tài khoản được lấy từ khóa công khai ECDSA, sau đó được băm bằng Keccak-256 thành đầu ra 32 byte và sau đó - thật ngạc nhiên - bị cắt bớt chỉ sử dụng 20 byte cuối cùng. Cuối cùng, nó có tiền tố là 0x. Xem thêm: https://ethereum.stackexchange.com/a/3619/47031
Paul Uszak avatar
lá cờ cn
@ user10030 Vì vậy, bạn có câu trả lời của mình :-) Cắt bớt thành bốn byte và bạn có nó, như trong scriptum bài đăng của tôi.
user10030 avatar
lá cờ in
Mặc dù tôi đánh giá cao sự tồn tại của giải pháp của bạn, nhưng tôi tin rằng đó không phải là thứ cuối cùng tôi cần. Trong trường hợp tôi cắt ngắn thành 4 byte, tôi bắt đầu khuyến khích người dùng của mình khai thác $n_b$s dẫn đến cùng $n_s$. Chắc chắn, đối với các địa chỉ $n_b$ chỉ chứa một lượng giá trị tiền tệ thấp, đây có thể không phải là vấn đề thực sự hoặc là một cuộc tấn công hợp lý về mặt kinh tế: Nhưng nhìn chung, tôi muốn tránh loại vấn đề này. Không thể có xung đột hoặc có thể có xung đột và tôi ngay lập tức nhận ra chúng vì tôi có thể nhìn lại tất cả các đầu vào và đầu ra của hoạt động băm khác.
Paul Uszak avatar
lá cờ cn
@ user10030 Chắc chắn sẽ có xung đột do nguyên tắc lỗ bồ câu. Với mức phí tốt nhất là $2^{-32}$ cho mỗi tài khoản. Sau đó, nó sẽ tăng lên 1 một cách không có triệu chứng khi tên miền đầy.
Điểm:1
lá cờ ph

Nếu tôi hiểu các yêu cầu, thì những gì bạn đang yêu cầu không phải là một "chức năng" theo định nghĩa thông thường. Có vẻ như bạn muốn một số $f$ đã đưa ra một chuỗi các đầu vào ${x_i}$ sẽ trả về một giá trị xác định $y_i$ hoặc một biểu tượng lỗi nếu nó đã trở lại $y_i$. Nhưng giả sử $x_k$ là đầu vào đầu tiên trả về lỗi. Điều gì sẽ xảy ra nếu bạn gọi $f$ với trình tự bắt đầu từ $x_k$? Tôi nghĩ bạn sẽ muốn nó không trả về lỗi, vì vậy giá trị của $f(x_k)$ không được xác định rõ.

Cách để giải quyết vấn đề đó về mặt toán học là thay đổi định nghĩa của $f$ để chấp nhận một trình tự. Nhưng trên thực tế, điều đó có thể có nghĩa là hệ thống của bạn ghi lại tất cả các đầu vào đã được gọi. Và bạn sẽ thấy rằng nếu bạn làm điều đó, bạn cũng có thể quay trở lại $0, ..., n-1$ cho các đầu vào riêng biệt đầu tiên và lỗi cho mọi thứ tiếp theo.

user10030 avatar
lá cờ in
Có, thực tế là "nhận biết va chạm" có thể có nghĩa là phải chuyển một chuỗi tới $f$. Trên thực tế, việc chuyển theo trình tự sẽ không có vấn đề gì miễn là nó không dẫn đến việc tăng dung lượng lưu trữ cho mỗi hoạt động băm mới. Tôi tự hỏi nếu có ví dụ. một cách mà giá trị đã truyền trước đó có thể được nhân tố hóa hoặc nén sao cho chúng không chiếm nhiều dung lượng lưu trữ và nơi mà việc luôn chuyển tất cả các giá trị trong quá khứ và một giá trị mới để làm cho chức năng "nhận biết va chạm" trở nên thực tế, như trong "nó trả về biểu tượng lỗi nếu nó gặp đầu ra nhiều hơn lần đầu tiên".

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.